Single instruction multiple data implementations of finite impulse response filters

ABSTRACT

A system for efficient derivation of finite impulse response (FIR) values. A single-instruction multiple data (SIMD) type of operation is used. In a preferred embodiment, the operation is achieved by an instruction called PAVG. The results of PAVG are a rounded-up average of two sets of packed values. Adjustments are made on the rounded-up average to obtain an exact desired result for various filter calculations. The invention also provides approaches to achieving approximate desired results that differ from the exact desired results yet remain within acceptable error ranges. The approximate approaches require less computation and can be advantageous in different applications, or embodiments, of the invention. Various techniques for minimizing processor resources (e.g., processing cycles, memory) are presented.

CROSS-REFERENCE TO RELATED APPLICATIONS

This application is related to the following co-pending U.S. Patent Applications which are hereby incorporated by reference as if set forth in full in this specification:

-   -   Ser. No. [TBD], filed on [TBD], entitled “SINGLE INSTRUCTION         MULTIPLE DATA IMPLEMENTATION OF FINITE IMPULSE RESPONSE FILTERS         INCLUDING ADJUSTED RESULT”; and     -   Ser. No. 10/057,694, filed on Jan. 23, 2002, entitled “METHODS         FOR EFFICIENT FILTERING OF DIGITAL SIGNALS.”

COPYRIGHT NOTICE

Portions of the disclosure recited in this specification contain material that is subject to copyright protection. Specifically, source code instructions by which specific embodiments of the present invention are practiced in a computer system are included. The copyright owner has no objection to the facsimile reproduction of the specification as filed in the Patent and Trademark Office. Otherwise all copyright rights are reserved.

BACKGROUND OF THE INVENTION

1. Field of the Invention

This invention is related in general to computer processing and more specifically to the use of single instruction multiple data (SIMD) instructions to achieve finite impulse response filter operations in a digital processor.

2. Description of the Background Art

Finite Impulse Response (FIR) filter operations are an important type of digital computation or processing. FIR filters are commonly used, for example, in pre-processing, post-processing, motion compensation, and motion estimation for video compression standards. The implementation of FIR filters in computer programs, or other digital processing approaches, is useful in many other applications including audio processing, signal conditioning, simulation of electronic components, etc.

FIR filter operations can be very demanding on digital processing systems because of the large number of iterative operations that must be performed very quickly. The number of operations, speed of operation, resolution of coefficient values, and other factors all contribute to the accuracy of the implementation and the amount of processing resources that are necessary to achieve a design goal. In this respect, a slight advantage in FIR filter operations that are executed frequently (i.e., in an “inner loop” of a program) can result in very significant performance gains.

An FIR filter that is of special interest in video compression and encoding techniques is referred to as a transversal or tapped delay filter. These filters multiply a set of coefficients to pixel values of a video frame to generate a new pixel value. Such an operation is useful, for example, to compress an image by combining adjacent pixel values into a smaller number of pixel values. Typically, this type of FIR filter includes only positive coefficients.

FIG. 1 illustrates four pixel values a₁, a₂, a₃, and a₄. Subpixel b is desired to be the average of the four pixels computed as: b=(a ₁ +a ₂ +a ₃ +a ₄+2)>>2,   (1) where >> is a bitwise right shift operator.

In a typical application where pixel values are limited to values in the range 0-255, the pixels a₁, . . . ,a₄ are each represented in one byte or 8 bits. Thus, a total of four bytes is necessary to operate on the four pixel values at once.

Typically, a single frame in a digital video presentation of moderate resolution can include 600×800=480,000 pixels. Such a frame might be displayed 30 times per second. Moreover, it may be necessary to perform additional “passes” over the frame so that, for example, in subsequent passes the pixels, themselves, are combined into subpixels to further compress an image. Thus, numerous subpixel computations may be necessary. Further digital video formats, such as high-definition television, use much higher screen resolutions and color depths. It should be apparent that such filter operations could place enormous requirements on processing resources, especially when the operations must be performed in real time.

One approach that the prior art uses to provide increased efficiency in filter or array operations is to use Single Instruction Multiple Data (SIMD) instructions. Such instructions allow value-packing, byte-packing, or other concatenating of values into a single word or other unit of data. The unit of data can be processed quickly by performing a desired operation in parallel on the packed values.

SIMD-type instructions are available in many processors. Examples include Intel Multi-Media Extensions (MMX)™ and Streaming SIMD Extension (SSE)™, as well as NEC VR5432, Equator MAP-CA™, and Philips TM-1300 processors. In processors whose architecture supports SIMD instructions there are typically multiple identical processors, N, each with its own local memory where it can store data. All processors work under the control of a single instruction stream issued by a central control unit. There are typically N data streams, one per processor. The processors operate synchronously: at each step, all processors execute the same instruction on a different data element. This architecture allows N computations in parallel. Thus, if N=8, it is possible to achieve a computational speedup of 8.

FIG. 2 provides an example of the operation of a SIMD instruction. The SIMD instruction performs an operation, “OP,” on two sets of data: A=[a₁, . . . ,a₈], a vector of 8 data values, each of which is an unsigned 8-bit integer, i.e., a_(i)ε[0,255]; and B=[b₁, . . . ,b₈], another vector of unsigned integers within the range [0,255]. The final result C=[c₁, . . . ,c₈] is achieved by simultaneously operating on all 8 values of a_(i) and b_(i) as c_(i)=a_(i) OP b_(i), for i=1, . . . ,8. In this example, A, B and C are 64-bit registers in which all 8 values of a_(i), b_(i), and c_(i) are packed as contiguous bytes as shown in FIG. 2, i.e., N=8. Such operations are also known as packed operations, since 8 values of data are packed in a single register A, B or C.

One specific type of operation of interest in filter operations is the PAVG operation that can be found, e.g., in the Intel MMX™ instruction set. The PAVG instruction performs the following computation: PAVG(A,B)=[(a _(i) +b _(i)+1)>>1, i=1, . . . ,8].   (2)

This operation takes 8-bit values of a_(i), b_(i), and stores the intermediate sum (a_(i)+b_(i)+1) in 9 bits before doing bitwise logical right shift operation to get the final result. It is available in many processors, including the ones mentioned above, and uses only one instruction. This instruction has the latency of 1 clock cycle in the Intel Pentium III, 2 clock cycles in Intel Pentium 4, and Advanced Micro Device's (AMD's) Athlon, with a throughput of 1 clock cycle. The same performance is realized for other operations in these architectures, such as packed addition (+), subtraction (−), bitwise AND (&), bitwise OR (|), bitwise EXCLUSIVE-OR ({circumflex over ( )}), bitwise right shift (>>), and bitwise left shift (<<) operations.

Although SIMD instructions can improve the efficiency and speed of computations, such instructions are sometimes difficult to use effectively when the SIMD instructions do not provide the exact type of operation needed. For example, as stated above, PAVG computes (a_(i)+b_(i)+1)>>1. An average of two vectors rounded up. However, it is more desirable in some filter operations to obtain (a_(i)+b_(i))>>1, which is a truncated average where the remainder, or fractional part, is discarded. Such a difference in operation is significant where multiple passes of frame data are made as the average intensity value of subpixels may increase and result in artifacts or other objectionable qualities to the processed data. In the architectures discussed herein, a SIMD instruction to compute (a_(i)+b_(i))>>1 is not provided. Typically, a non-SIMD approach must be used.

A problem also arises when the number of arguments required by a SIMD operation is not the same as the number of variables in a formula to be implemented by the SIMD operation. For example, if a SIMD instruction accepts two arguments then it is “mismatched” to implement a formula, computation or operation with more than two variables or values. The same can be said, for example, for a SIMD instruction with three arguments used to implement a formula with other than three variables, etc.

FIG. 3 illustrates a non-SIMD approach to compute (a_(i)+b_(i))>1.

In FIG. 3, a_(i), b_(i) are unsigned integers within the range [0,255], i.e., each a_(i), b_(i) is represented in 8 bits. The number of processors, N=8, i.e., the operation (a_(i)+b_(i))>>1 is simultaneously performed on 8 values of a_(i) and b_(i) for i=1, . . . ,8. All 8 values of a_(i) (usually contiguous pixels) are packed in 64-bit register, A, and 8 values of b_(i) in 64-bit register B. Since a_(i)+b_(i) can exceed 8 bits, the 8-bit (byte) values of a_(i), b_(i) are unpacked into 16-bits (words) as four 16-bit values per 64-bit register,. Then the packed registers A and B are added together, followed by bitwise logical right shift by 1, followed by packing again. Note that in most processors, data can be packed into 64-bit registers as 8 (byte), 16 (word), 32 (dword), or 64 (qword) bit values only. FIG. 3 shows the conventional method of doing the packed operation c_(i)=(a_(i)+b_(i))>>1 for i=1, . . . ,8. It is clear from FIG. 3, that given sufficient memory, 9 instructions are needed to achieve the result c_(i)=(a_(i)+b_(i))>>1 for all 8 values of a_(i) and b_(i). Each instruction in FIG. 3 is represented by an ellipse.

SUMMARY OF EMBODIMENTS OF THE INVENTION

The invention provides a system for efficient derivation of finite impulse response (FIR) values. A single-instruction multiple data (SIMD) type of operation is used. In a preferred embodiment, the operation is achieved by an instruction called PAVG. The results of PAVG are a rounded-up average of two sets of packed values. Adjustments are made on the rounded-up average to obtain an exact desired result for various filter calculations.

The invention also provides approaches to achieving approximate desired results that differ from the exact desired results yet remain within acceptable error ranges. The approximate approaches require less computation and can be advantageous in different applications, or embodiments, of the invention. An adjusted approximate approach improves the accuracy of the approximate approach. Various techniques for minimizing processor resources (e.g., processing cycles, memory) are presented.

These provisions together with the various ancillary provisions and features which will become apparent to those artisans possessing skill in the art as the following description proceeds are attained by devices, assemblies, systems and methods of embodiments of the present invention, various embodiments thereof being shown with reference to the accompanying drawings, by way of example only, wherein:

One embodiment of the invention provides a method for obtaining an average of a plurality of values, wherein a first plurality of values is stored in a first packed structure, wherein a second plurality of values is stored in a second packed structure, the method comprising using an averaging operation on the values in the first and second packed structures to obtain a plurality of values in a packed average result, wherein a value in the packed average result equals a rounded-up average of a value in the first packed structure and a value in the second packed structure; determining whether the sum of the value in the first packed structure plus the value in the second packed structure is an odd number and, if so, performing the step of subtracting one from the value in the packed average result to obtain a packed adjusted result.

Another embodiment provides a method for adjusting the result of a PAVG instruction, wherein a first set, A, of packed values, a_(i), and a second set, B, of packed values, b_(i), are operated on by PAVG to obtain PAVG(A,B)=[(a_(i)+b_(i)+1)>>1, i=1, . . . ,8], the method comprising adjusting the result of the PAVG operation to obtain a packed value result, C, as C=PAVG(A,B)−(A{circumflex over ( )}B) & 0x01.

Another embodiment of the invention provides a method for achieving an averaged result on packed binary values A₁,A₂, A₃,A₄, the method using a PAVG instruction that computes a rounded-up average on first and second sets of packed values to produce a resulting set of packed averages, wherein B1=PAVG(A₁,A₂) and B2=PAVG(A₃,A₄), the method comprising deriving a result, R, as $\begin{matrix} {R = \left\{ \begin{matrix} {{{{{PAVG}\left( {B_{1},B_{2}} \right)} - \left( {{B_{1}}^{\bigwedge}B_{2}} \right)}\&}\quad{ONE}} & {{{when}\quad E} = 0} \\ {{PAVG}\left( {B_{1},B_{2}} \right)} & {{{when}\quad E} = 1} \end{matrix} \right.} & (3) \end{matrix}$ wherein ONE is a value with a one in the least significant bit position of one or more packed values (although typically a one value is used in the least significant bit position of every packed value) and wherein E=1 when both (A₁+A₂+ONE) and (A₃+A₄+ONE) are odd integers.

Yet another embodiment of the invention provides a method for achieving an approximate averaged result on packed binary values A₁,A₂, A₃,A₄, for use in finite impulse response filter computations, the method using a PAVG instruction that computes a rounded-up average on first and second sets of packed values to produce a resulting set of packed averages, wherein B₁=PAVG(A₁,A₂) and B₂=PAVG(A₃,A₄), the method comprising deriving a result, R, as R=PAVG(B₁,B₂)−(B₁{circumflex over ( )}B₂) & ONE wherein ONE is a value with a one in the least significant bit position of one or more packed values.

Still another embodiment of the invention provides a method for achieving an averaged result on packed binary values for use in finite impulse response filter computations, the method using an instruction, PAVG, that computes a rounded-up average on first and second sets of packed values to produce a resulting set of packed averages, the method comprising detecting when the use of the PAVG instruction introduces a rounding-up increase in an averaged result; and decreasing the rounding-up increase to achieve a desired result.

BRIEF DESCRIPTION OF THE DRAWINGS

FIG. 1 illustrates a subpixel average of four pixel values;

FIG. 2 shows an example of the execution of a single-instruction multiple-data (SIMD) instruction;

FIG. 3 shows a non-SIMD approach to a calculation; and

FIG. 4 shows a SIMD implementation with adjustment.

DETAILED DESCRIPTION OF EMBODIMENTS OF THE INVENTION

A preferred embodiment of the invention uses Intel's MMX/SSE architecture, including the SIMD PAVG operation. Other embodiments may use other processors, instructions and operations in a manner similar to that disclosed herein and realize similar computational benefits. In addition, other techniques and approaches for performing processing may benefit from one or more of the features presented herein, such as the techniques of the related patent application “METHODS FOR EFFICIENT FILTERING OF DIGITAL SIGNALS,” cited above.

Table I shows notations used in this application. TABLE I Operator Description + Addition − subtraction & bitwise AND | bitwise OR

bitwise exclusive OR >> bitwise logical right shift << bitwise logical left shift ˜ Bitwise NOT CLIP(x) Clips x to range [0, 255] ODD(x) Returns 1 when x is odd, 0 otherwise EVEN(x) Returns 1 when x is even, 0 otherwise

The present invention allows computing c_(i)=(a_(i)+b_(i))>>1 for i=1, . . . ,8, in an efficient manner using a SIMD instruction such as PAVG. Note that simply using the PAVG instruction on packed values in registers A and B will not yield the correct answer. For example, when a_(i)+b_(i) is an odd number PAVG(a_(i), b_(i)) gives a result that is one more than the correct answer. The result of a PAVG operation must be adjusted as follows: C=PAVG(A,B)−(A{circumflex over ( )}B) & 0x01, where 0x01 is a 8-bit number whose least significant bit is 1 and the rest are 0's.

The PAVG operation with adjustment is shown in FIG. 4. Assuming sufficient memory, only 4 instructions instead of the previous 9 instructions (without using PAVG) are needed to achieve the packed operation C=(A+B)>>1. This is an approximate speedup of 9/4=2.25 times.

A preferred embodiment of the invention achieves the same computational result as in FIG. 4 with even fewer instructions by appropriately using the PAVG instruction in combination with supplemental logical operations to adjust for the rounded-up average. As described below, several FIR filtering operations can be modified to obtain result in fewer instructions when compared to conventional SIMD implementations.

Without loss of generality, let A₁, A₂, . . . ,A₁₆ be 16 vectors, each of which contain 8 packed data elements. For example, A₅ contains 8 data elements A₅=[a_((5,1)), . . . , a_((5,8))]. Each data element a_((1,i)), . . . , a_((16,i)) for i=1, . . . 8, is within the range [0,255], i.e., they are represented by bytes, and A₁, . . . ,A₁₆ are packed 64-bit registers: A _(j) =[a _((j,1)) , . . . , a _((j,8))] for j=1, . . . ,16.   (4)

We perform various operations on the packed 64-bit registers A₁, . . . , A₁₆ to obtain different FIR filters described below. We define packed 64-bit vectors/registers ONE and ONE₄ as follows: ONE=[0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01], ONE₄=[0x0001, 0x0001, 0x0001, 0x0001],   (5) where 0x01 is a byte containing 1 in its least significant bit and 0's elsewhere. The packed 64-bit register ONE contains 8 packed bytes, each containing 0x01. On the other hand, the packed 64-bit register ONE₄ contains 4 packed words (16 bits), each containing 0x0001.

The FIR filters used in a preferred embodiment include: 1. Type 1 Filter: (A ₁ +A ₂ +c*ONE)>>1, where cε{−2,−1,0,1,2},   (6) 2. Type 2 Filter: (A ₁ +A ₂ +A ₃ +A ₄ +c*ONE)>>2, where cε{0,1,2},   (7) 3. Type 3 Filter: (A ₁ +A ₂ +A ₃ +A ₄ +A ₅ +A ₆ +A ₇ +A ₈ +c*ONE)>>3, where cε{0,1,2,3,4},   (8) 4. Type 4 Filter: (A ₁ +A ₂ + . . . +a ₁₅ +A ₁₆ +c*ONE)>>4, where cε{0,1,2,3,4,5,6,7,8}.   (9)

All 4 types of FIR filters are useful for video compression applications. There are numerous FIR filters that can be constructed from these 4 basic types, in addition to those described herein. For example, the filter (2A₁+A₂+A₃+2*ONE)>>2 is a Type 2 filter with A₁=A₄. Similarly, the filter (A₁+2A₂+2A₃+2A₄+A₅+4*ONE)>>3 is a Type 3 filter with A₂=A₆, A₃=A₇, and A₄=A₈. Many other types of filters can be constructed as will be apparent to one of skill in the art.

Instructions according to the present invention can be used to obtain exact filter computations. Such exactness may be necessary as, e.g., in motion compensation and estimation applications where accuracy is key. In other cases an approximation of the filter computation may be sufficient. For example, in cases where the number of operations is large an approximate computation can be a better tradeoff. The approximations of the preferred embodiments produce an error of ±1 in the final result for a small percentage of all values of a_((j,i))ε[0,255] for i=1, . . . ,8, and j=1, . . . ,16. These results are useful in cases such as post processing, where a small error of ±1 (in intensity or color value) is inconsequential in the final result. Naturally, other approximations of different degrees of accuracy are possible and are within the scope of the invention.

I. Type 1 FIR Filters

There are 5 variations of the Type 1 FIR filters (A₁+A₂+c*ONE), where cε{−2, −1,0,1,2}, based on the 5 choices of constant c. We state the SIMD implementation for each of these filters: (A ₁ +A ₂−2*ONE)>>1=PAVG(A ₁ ,A ₂)−ONE−(A ₁ {circumflex over ( )}A ₂) & ONE,   (10) (A ₁ +A ₂−ONE)>>1=CLIP(PAVG(A ₁ ,A ₂)−ONE),   (11) (A ₁ +A ₂)>>1=PAVG(A ₁ ,A ₂)−(A ₁ {circumflex over ( )}A ₂) & ONE,   (12) (A ₁ +A ₂+ONE)>>1=PAVG(A ₁ ,A ₂),   (13) (A ₁ +A ₂+2*ONE)>>1=PAVG(A ₁ ,A ₂)+(˜(A ₁ {circumflex over ( )}A ₂) & ONE).   (14)

There is a less efficient solution for (A₁+A₂)>>1 that will be used to simplify expressions: (A ₁ +A ₂)>>1=(A ₁>>1)+(A ₂>>1)+(A ₁ & A ₂ & ONE).   (15)

Although (15) uses more instructions that (12), we need this expression to evaluate other filters. In (15), (A₁ & A₂ & ONE) is a correction term that is necessary when both A₁ and A₂ contain odd integers. An approximate solution for (A₁+A₂)>>1 is: (A ₁ +A ₂)>>1≅PAVG(CLIP(A ₁−ONE),A ₂) or PAVG(A ₁,CLIP(A ₂−ONE)).   (16)

In most processors, subtract and CLIP( ) can be realized in one instruction. So the implementations in (16) require only 2 instructions.

II. Type 2 FIR Filters

There are 3 variations of Type 2 filters (7) based on the 3 choices of constant c, where cε{0,1,2}. We show the derivation of each filter. We define the following 64-bit packed registers, each containing 8 data elements of one byte each: B ₁ =PAVG(A ₁ ,A ₂), B ₂ =PAVG(A ₃ ,A ₄), EB ₁=(A ₁ {circumflex over ( )}A ₂), EB ₂ =( A ₃ {circumflex over ( )}A ₄).   (17) A. Type 2, Filter 1: R=(A₁+A₂+A₃+A₄+2*ONE)>>2 i. Conventional SIMD Solution

This filter can be implemented in SIMD architecture (assuming sufficient memory) by using the following steps:

-   -   1. (4 Instructions) A_(iL)=Unpack Low 4 Bytes of A_(i), for         i={1,2,3,4},     -   2. (4 Instructions) A_(iH)=Unpack High 4 Bytes of A_(i), for i         ={1,2,3,4},     -   3. (5 Instructions) Add and Shift lower 4 words of A₁, . . . ,A₄         to obtain lower 4 words of R_(L) as:         R _(L)=(A _(1L) +A _(2L) +A _(3L) +A _(4L)+2*ONE₄)>>2,     -   4. (5 Instructions) Add and Shift higher 4 words of A₁, . . .         ,A₄ to obtain higher 4 words of R_(H) as:         R _(H)=(A _(1H) +A _(2H) +A _(3H) +A _(4H)+2*ONE₄)>>2,     -   5. (1 Instruction) Pack R_(H) and R_(L) into final register R.

We require 19 instructions to perform this filter by conventional SIMD methods.

ii. Efficient SIMD Solution

In order to implement this filter efficiently, we simplify as follows: R=(((A ₁ +A ₂+ONE)>>1)+((A ₃ +A ₄+ONE)>>1)+E)>>1=(B ₁ +B ₂ +E)>>1,   (18) where E is the correction term that is necessary when both (A₁+A₂+ONE) and (A₃+A₄+ONE) are odd integers as in (15). Detection of odd or even integers is performed with the functions ODD( ) and EVEN( ). Where ODD( ) returns “1” for each packed argument value only if the packed argument value is an odd number and returns “0” otherwise, and where EVEN( ) returns “1” for each packed argument value only if the packed argument value is an even number and returns “0” otherwise. $\begin{matrix} \begin{matrix} {E = {{{{ODD}\left( {A_{1} + A_{2} + {ONE}} \right)}\&}\quad{{ODD}\left( {A_{3} + A_{4} + {ONE}} \right)}}} \\ {= {{{{EVEN}\left( {A_{1} + A_{2}} \right)}\&}\quad{{EVEN}\left( {A_{3} + A_{4}} \right)}}} \\ {= {{{{{\sim \left( {{A_{1}}^{\hat{}}A_{2}} \right)}\&} \sim \left( {{A_{3}}^{\hat{}}A_{4}} \right)}\&}\quad{ONE}}} \\ {= {{{\sim \left( {{EB}_{1}❘{EB}_{2}} \right)}\&}\quad{{ONE}.}}} \end{matrix} & (19) \end{matrix}$

We note that Eε{0,1}. From (18) and (12), we have: $\begin{matrix} {R = \left\{ {\begin{matrix} {{{{{PAVG}\left( {B_{1},B_{2}} \right)} - \left( {{B_{1}}^{\hat{}}B_{2}} \right)}\&}\quad{ONE}} & {{{when}\quad E} = 0} \\ {{PAVG}\left( {B_{1},B_{2}} \right)} & {{{when}\quad E} = 1} \end{matrix}.} \right.} & (20) \end{matrix}$ We simplify (20) as: R=PAVG(B ₁ {circumflex over ( )}B ₂)−(B ₁ {circumflex over ( )}B ₂) & ˜E & ONE, which is same as: R=PAVG(B ₁ ,B ₂)−(B ₁ {circumflex over ( )}B ₂) & ((A ₁ {circumflex over ( )}A ₂)|(A ₃ {circumflex over ( )}A ₄)) & ONE.   (21) The solution in (21) requires 10 instructions. We have an approximate 19:10 (approx. 2:1) speedup by using (21). iii. Approximate SIMD Solution

Besides the accurate solution, we can obtain an approximate solution in fewer instructions by assuming the least significant bit of EB₁ or EB₂ as 0 or 1. Assuming the least significant bit of EB₁ or EB₂=1, we get: R≅PAVG(B ₁ ,B ₂)−(B ₁ {circumflex over ( )}B ₂) & ONE.   (22) This solution requires 6 instructions, and according to (16), it is close to the following: R≅PAVG(CLIP(B ₁−ONE),B ₂) or R≅PAVG(B ₁,CLIP(B ₂−ONE))   (23) This solution requires only 4 instructions, and produces a maximum error of ±1 in the final result for 12.5% of all possible values of A₁, . . . ,A₄ between [0,255]. The error never exceeds ±1. We get a computational efficiency of 19:4, nearly 5 times speedup. B. Type 2, Filter 2: R=(A₁+A₂+A₃+A₄+ONE)>>2 i. Efficient SIMD Solution

As seen in Section 3.A, this filter can be implemented by conventional SIMD methods in 19 instructions. For efficient implementation, we simplify as follows: R=(((A ₁ +A ₂+ONE)>>1)+((A ₃ +A ₄)>>1)+E)>>1=(B ₁ +B ₂+(E−(EB ₂&ONE)))>>1.   (24) Here EB₂ is due to the correction term in (12), and E is the correction term in (15) as: $\begin{matrix} \begin{matrix} {E = {{{{ODD}\left( {A_{1} + A_{2} + {ONE}} \right)}\&}\quad{{ODD}\left( {A_{3} + A_{4}} \right)}}} \\ {= {{{{EVEN}\left( {A_{1} + A_{2}} \right)}\&}\quad{{ODD}\left( {A_{3} + A_{4}} \right)}}} \\ {= {{{{{{\sim \left( {{A_{1}}^{\hat{}}A_{2}} \right)}\&}\left( {{A_{3}}^{\hat{}}A_{4}} \right)}\&}\quad{ONE}} = {{\left( {{{\sim {EB}_{1}}\&}{EB}_{2}} \right)\&}\quad{{ONE}.}}}} \end{matrix} & (25) \end{matrix}$ We note that E_(T)=(E−(EB₂&ONE)) ε{0,−1}. From (24), (11), and (12) we obtain: $\begin{matrix} {R = \left\{ {\begin{matrix} {{{{{PAVG}\left( {B_{1},B_{2}} \right)} - \left( {{B_{1}}^{\hat{}}B_{2}} \right)}\&}\quad{ONE}} & {{{when}{\quad\quad}E_{T}} = 0} \\ {{{PAVG}\left( {B_{1},B_{2}} \right)} - {ONE}} & {{{when}\quad E_{T}} = {- 1}} \end{matrix}.} \right.} & (26) \end{matrix}$ Note that (E−(EB₂&ONE))=−1 when (A₁{circumflex over ( )}A₂) & (A₃{circumflex over ( )}A₄) & ONE=1. We simplify (26) as: R=PAVG(B ₁ ,B ₂)−((B ₁ {circumflex over ( )}B ₂)|((A ₁ {circumflex over ( )}A ₂) & (A ₃ {circumflex over ( )}A ₄))) & ONE.   (27) The solution in (27) requires 10 instructions, an approximate 19:10 (nearly 2 times) speedup. ii. Approximate SIMD Solution

We can obtain four approximations of (27) by assuming the least significant bit of EB₁ or EB₂ as 0 or 1. A good approximate solution is with the assumption that the least significant bit of EB₂=0, which gives us the same solutions as (22) and (23), which require 4 instructions and has a maximum error of ±1 for 12.5% of all possible values of A₁, . . . , A₄ ε[0,255]. We get a computational advantage of 19:4.

C. Type 2, Filter 3: R=(A₁+A₂+A₃+A₄)>>2

i. Efficient SIMD Solution

The filter can be implemented by conventional SIMD methods in 17 instructions. For efficient implementation, we simplify as follows: R=(((A ₁ +A ₂)>>1)+((A ₃ +A ₄)>>1)+E)>>1=(B ₁ +B ₂+(E−(EB ₁ +EB ₂)&ONE))>>1.   (28) Here EB₁ and EB₂ are due to the correction term in (12), and E is the correction term in (15) as: E=ODD(A ₁ +A ₂) & ODD(A ₃ +A ₄)=(A ₁ {circumflex over ( )}A ₂) & (A ₃ {circumflex over ( )}A ₄) & ONE=EB ₁ & EB ₂ & ONE.   (29) We note that E_(T)=(E−(EB₁+EB₂) & ONE) ε{0, −1}, and R is same as (26). Note that E_(T)=−1 when (A₁{circumflex over ( )}A₂)|(A₃{circumflex over ( )}A₄) & ONE=1. We simplify (26) as: R=PAVG(B ₁ ,B ₂)−((B ₁ {circumflex over ( )}B ₂)|(A ₁ {circumflex over ( )}A ₂)|(A ₃ {circumflex over ( )}A ₄)) & ONE.   (30) The solution in (30) requires 10 instructions. We have an approximate 17:10 speedup by using (30). ii. Approximate SIMD Solution

We can obtain four approximations of (30) by assuming the least significant bit of EB₁ or EB₂ as 0 or 1. A good approximate solution is with the assumptions that the least significant bits of EB₁ or EB₂=1, which gives us: R≅CLIP(PAVG(B ₁ ,B ₂)−ONE).   (31) This solution requires 4 instructions and has a maximum error of ±1 for 12.5% of all possible values of A₁, . . . ,A₄ ε[0,255]. We have a computational advantage of 17:4, approx. 4 times. D. Type 2, Special Filter 1: R=(2A₁+A₁+A₄+2*ONE)>>2

This filter is same as Filter 1 with A₁=A₂. It can be implemented by conventional SIMD methods in, e.g., 17 instructions. This type of filter is used extensively in, for example, standards proposed by the Joint Video Team (JVT) as, for example, in [CHANGE THIS—CHANCHAL TO UPDATE TO MORE CURRENT REFERENCE→ISO/IEC MPEG and ITU-T VCEG, Geneva, Switzerland, October, 2002; entitled “Editor's Proposed Draft Text Modifications for Joint Video Specification (ITU-T Rec. H.264|ISO/IEC 14496-10 AVC), Geneva modifications, draft 26.and other coding schemes.←END REFERENCE]

We can simplify (21) as: R=PAVG(A ₁ ,B ₂)−(A ₁ {circumflex over ( )}B ₂) & (A ₃{circumflex over ( )}A₄) & ONE.   (32) This solution requires 7 instructions. One can verify that (32) is close to the following: R≅PAVG(A ₁ ,PAVG(CLIP(A ₃−ONE),A ₄)),   (33) which requires only 3 instructions instead of 17 instructions by conventional SIMD methods, a nearly 6 times speedup. However, (33) produces an error of ±1 for a very small 0.1% of all possible values of A₁, . . . , A₄ ε[0,255]. E. Type 2, Summary of Results

Table II below summarizes the instructions required to compute each filter (given sufficient memory) by the efficient and conventional SIMD methods. For the Efficient case, we give the instructions required for the exact and approximate solutions.

Summary of Results for Type 2 FIR Filters

TABLE II Conventional Efficient Method Speedup Type 2 Filters Method Exact Approx. Exact Approx. (A₁ + A₂ + A₃ + 19 10 4 1.9 4.75 A₄ + 2 * ONE) >> 2 (A₁ + A₂ + A₃ + A₄ + 19 10 4 1.9 4.75 ONE) >> 2 (A₁ + A₂ + A₃ + 17 10 4 1.7 4.25 A₄) >> 2 (2A₁ + A₂ + 17 7 3 2.4 5.67 A₃ + 2 * ONE) >> 2

The shaded areas show significant improvements in efficiency due to the analyses developed here.

3. Type 3 FIR Filters

There are 5 different Type 3 FIR filters depending on the 5 choices of c in (8). We define the following packed 64-bit registers, each containing 8 data elements of one byte each: B ₁ =PAVG(A ₁ ,A ₂), B ₂ =PAVG(A ₃ ,A ₄), B ₃ =PAVG(A ₅ ,A ₆), B ₄ =PAVG(A ₇ ,A ₈), C ₁ =PAVG(B ₁ ,B ₂), C ₂ =PAVG(B ₃ ,B ₄), EB ₁=(A ₁ {circumflex over ( )}A ₂), EB ₂=(A ₃ {circumflex over ( )}A ₄), EB ₃=(A ₅ {circumflex over ( )}A ₆), EB ₄=(A ₇ {circumflex over ( )}A ₈), EC ₁=(B ₁ {circumflex over ( )}B ₂), EC ₂=(B ₃ {circumflex over ( )}B ₄).   (34) A. Type 3, Filter 1: R=(A₁+A₂+A₃+A₄+A₅+A₆+A₇+A₈+4*ONE)>>3 i. Conventional SIMD Solution

This filter can be implemented in SIMD architecture (assuming sufficient memory) by using the following steps:

-   -   1. (8 Instructions) A_(iL)=Unpack Low 4 Bytes of A_(i), for i=1,         . . . ,8,     -   2. (8 Instructions) A_(iH)=Unpack High 4 Bytes of A_(i), for i1,         . . . ,8,     -   3. (9 Instructions) Add and Shift lower 4 words of A₁, . . . ,A₈         to obtain lower 4 words of R_(L) as:         R _(L)=(A _(1L) +A _(2L) +A _(3L) +A _(4L) +A _(5L) +A _(6L) +A         _(7L)+A_(8L)+4*ONE₄)>>3,     -   4. (9 Instructions) Add and Shift higher 4 words of A₁, . . .         ,A₈ to obtain higher 4 words of R_(H) as:         R _(H)=(A _(1H) +A _(2H) +A _(3H) +A _(4H) +A _(5H) +A _(6H) +A         _(7H) +A _(8H)+4*ONE₄)>>3,     -   5. (1 Instruction) Pack R_(H) and R_(L) into final register R.

We require 35 instructions to compute this filter by conventional SIMD methods.

ii. New SIMD Solution

In order to implement this filter without unpacking, we simplify it as follows: R=(((A ₁ +A ₂ +A ₃ +A ₄+2*ONE)>>2)+((A ₅ +A ₆ +A ₇ +A ₈+2*ONE)>>2)+E)>>1,   (35) where E is the error/correction term that is necessary for dividing up the expression into two parts each containing a Type 2, Filter 1 (21). Note that according to (21) and the registers in (34), we have: (A ₁ +A ₂ +A ₃ +A ₄+2*ONE)>>2=C ₁−(E ₁ & ONE), (A ₅ +A ₆ +A ₇ +A ₈+2*ONE)>>2=C ₂−(E ₂ & ONE),   (36) where E₁=EC₁ & (EB₁|EB₂) and E₂=EC₂ & (EB₃|EB₄) are error/correction terms obtained in (21). We can simplify (35) as: R=(C ₁ +C ₂+(E−E ₁ −E ₂)&ONE)>>1.   (37) We now find the expression for E in terms of the packed 64-bit registers in (34). The simplification in (35), amounts to the following: (P+Q)>>3=((P>>2)+(Q>>2)+E)>>1,   (38) where P and Q are unsigned integers. Let p₀ be the least significant bit of P and p₁ the next significant bit of P. Similarly, let q₀ be the least significant bit of Q and q₁ the next significant bit of Q. The simplification in (38) results in an error E when the last 2 bits of P and Q add up to a number≧4. The condition that determines this error E is: (p₁ & q₁)|(p₀ & q₀ & (p₁|q₁)). We can prove that p₁, p₀, q₁, q₀ can be expressed in terms of the registers in (34) as the least significant bits of the following packed 64-bit registers respectively: P ₁=(EC ₁{circumflex over ( )}˜(EB ₁ |EB ₂)), P ₀=(EB ₁ {circumflex over ( )}EB ₂), Q ₁=(EC ₂{circumflex over ( )}˜(EB ₃ |EB ₄)), Q ₀=(EB ₃ {circumflex over ( )}EB ₄),   (39) From (39), we can express E as the least significant bit of: E=(P ₁ & Q ₁)|(P ₀ & Q ₀ & (P ₁ |Q ₁))   (40) We note that E ε{0,1}, and E_(T)=(E−E₁−E₂)ε{−1, 0, 1}. From (37), we have: $\begin{matrix} {R = \left\{ {\begin{matrix} {{{PAVG}\left( {C_{1},C_{2}} \right)} - {ONE}} & {{{when}\quad E_{T}} = {- 1}} \\ {{{{{PAVG}\left( {C_{1},C_{2}} \right)} - \left( {{C_{1}}^{\hat{}}C_{2}} \right)}\&}\quad{ONE}} & {{{when}{\quad\quad}E_{T}} = 0} \\ {{PAVG}\left( {C_{1},C_{2}} \right)} & {{{when}\quad E_{T}} = 1} \end{matrix}.} \right.} & (41) \end{matrix}$ We simplify (41) as: R=PAVG(C ₁ ,C ₂)−((C ₁ {circumflex over ( )}C ₂)|(E ₁ {circumflex over ( )}E ₂ {circumflex over ( )}E)) & (E ₁ |E ₂ |E) & ONE,   (42) where E₁=EC₁ & (EB₁|EB₂) and E₂=EC₂ & (EB₃|EB₄). We can further simplify (42) as an expression in terms of EC₁, EC₂, EB₁, EB₂, EB₃, and EB₄ so that we can skip the computations of E₁, E₂, and E as follows: U=EC ₁ |EC ₂, V=EB ₁ |EB ₂, W=EB ₃ |EB ₄, X=V|W, Y=U|X, Z=(EC ₁ & EC ₂ & X), T=U & V & W & ((EB ₁ & EB ₂)|(EB ₃ & EB ₄)), R=PAVG(C ₁ ,C ₂)−((C ₁ {circumflex over ( )}C ₂)|Z|T) & Y & ONE,   (43)

The solution in (43) is shown in pseudo-code in Table III, below. Any suitable language, coding technique, circuitry or combination of hardware and software can be used to achieve the functionality shown in the pseudo-code presented herein. The approach of Table III uses 32 instructions as compared to the conventional 35 instructions. The count of 32 instructions is obtained by counting each logical and arithmetic operation of (43) along with those of (34). Other instruction counts in this application are obtained, similarly. Clearly, the approach of Table III is not as efficient as the Type 2 algorithms. However, there are at least 2 benefits of this approach:

-   -   (1) We can systematically arrive at approximate solutions by         making assumptions on the error/correction terms EC₁, EC₂, EB₁,         EB₂, EB₃, and EB₄ (see Section 3.A.iii).

(2) In special cases, where various A_(i)'s are same, we can simplify the computation considerably and obtain efficient exact and approximate solutions (see Sections 3.F-3.H). TABLE III #define P(a,b) (((a) + (b) + 1) >> 1) b1 = P(a01,a02); b2 = P(a03,a04); b3 = P(a05,a06); b4 = P(a07,a08); c1 = P(b1,b2 ); c2 = P(b3,b4 ); d = P(c1,c2 ); eb1 = a01 {circumflex over ( )} a02; eb2 = a03 {circumflex over ( )} a04; eb3 = a05 {circumflex over ( )} a06; eb4 = a07 {circumflex over ( )} a08; ec1 = b1 {circumflex over ( )} b2; ec2 = b3 {circumflex over ( )} b4; ed = c1 {circumflex over ( )} c2; u = ec1 | ec2; v = eb1 | eb2; w = eb3 | eb4; x = v | w; y = u | x; z = ec1 & ec2 & x; t = u & v & w & ((eb1 & eb2) | (eb3 & eb4)); e = ((ed & y) | z | t) & 0x01; // Exact solution x1 = CLIP(d − e); iii. Approximate SIMD Solution

We have many approximate solutions by assuming the least significant bit of EB₁, EB₂, EB₃, EB₄, EC₁, or EC₂ as 0 or 1. With the assumption that the least significant bit of EB₁=1, and EB₂=EB₃=EB₄=0, we get from (43): R=PAVG(C ₁ ,C ₂)−((C ₁ {circumflex over ( )}C ₂)|(EC ₁ & EC ₂)) & ONE.   (44)

An example pseudo-code implementation of this solution is shown in Table IV, below. This approach uses 14 instructions, and produces a maximum error of ±1 in the final result for 9.38% of all possible values of A₁, . . . ,A₈ between [0,255]. The error never exceeds ±1. This solution with 14 instructions, and a maximum error of ±1 for less than {fraction (1/10)}^(th) of the data is acceptable in many applications like post-processing, where a difference of 1 gray value in the displayed frame is imperceptible to most of us. Yet, we receive a computational advantage of 35:14.

The second approximate solution makes the assumption EB₁=0, and EB₂=1. It produces the following solution: T=(EC ₁ |EC ₂) & (EB ₃ |EB ₄) & EB ₃ & EB ₄, R=PAVG(C ₁ ,C ₂)−((C ₁ {circumflex over ( )}C ₂)|(EC ₁ & EC ₂)|T) & ONE,   (45)

This solution requires 22 instructions, and produces a maximum error of ±1 in the final result for 6.25% of all possible values of A₁, . . . ,A₈ between [0,255]. TABLE IV #define P(a,b) (((a) + (b) + 1) >> 1) b1 = P(a01,a02); b2 = P(a03,a04); b3 = P(a05,a06); b4 = P(a07,a08); c1 = P(b1,b2 ); c2 = P(b3,b4 ); d = P(c1,c2 ); ec1 = b1 {circumflex over ( )} b2; ec2 = b3 {circumflex over ( )} b4; ed = c1 {circumflex over ( )} c2; e = (ed | (ec1 & ec2)) & 0x01; //approx = 9.375% x1 = CLIP(d − e); B. Type 3, Filter 2: R=(A₁+A₂+A₃+A₄+A₅+A₆+A₇++3*ONE)>>3

We require 35 instructions to compute this filter by conventional SIMD methods. For the new SIMD solution, we write the filter as: R=(((A ₁ +A ₂ +A ₃ +A ₄+2*ONE)>>2)+((A ₅ +A ₆ +A ₇ +A ₈+ONE)>>2)+E)>>1, where E is the error/correction term that is necessary for dividing up the expression into two parts each containing a Type 2 Filter. We have: R=(C ₁ +C ₂+(E−E ₁ −E ₂)&ONE)>>1, (A ₁ +A ₂ +A ₃ +A ₄+2*ONE)>>2=C ₁−(E ₁ & ONE), (A ₅ +A ₆ +A ₇ +A ₈+ONE)>>2=C ₂−(E ₂ & ONE), E ₁ =EC ₁ & (EB ₁ |EB ₂), E ₂ =EC ₂|(EB ₃ & EB ₄), P ₁=(EC ₁{circumflex over ( )}˜(EB ₁ |EB ₂)), P ₀=(EB ₁ {circumflex over ( )}EB ₂), Q ₁=(EC ₂{circumflex over ( )}˜(EB ₃ & EB ₄)), Q ₀=˜(EB ₃ {circumflex over ( )}EB ₄), E=(P ₁ & Q ₁)|(P ₀ & Q ₀ & (P ₁ |Q ₁)). Here E₁ and E₂ are error/correction terms obtained from (21) and (27) respectively. Defining E_(T)=(E−E₁−E₂) ε{−2, −1, 0}, we have: $\begin{matrix} {R = \left\{ {\begin{matrix} {{{{{PAVG}\left( {C_{1},C_{2}} \right)} - \left( {{C_{1}}^{\hat{}}C_{2}} \right)}\&}\quad{ONE}} & {{{when}\quad E_{T}} = 0} \\ {{{PAVG}\left( {C_{1},C_{2}} \right)} - {ONE}} & {{{when}\quad E_{T}} = {- 1}} \\ {{{{{PAVG}\left( {C_{1},C_{2}} \right)} - {ONE} - \left( {{C_{1}}^{\hat{}}C_{2}} \right)}\&}\quad{ONE}} & {{{when}\quad E_{T}} = {- 2}} \end{matrix}.} \right.} & (46) \end{matrix}$ We simplify (46) as: S=(E ₁ {circumflex over ( )}E ₂ {circumflex over ( )}E), R=PAVG(C ₁ ,C ₂)−((E ₁ & E ₂ & ˜E)|S) & ONE−((C ₁ {circumflex over ( )}C ₂)& ˜S) & ONE,   (47)

This solution can be further simplified as: P=EB₃ & EB₄, U=EB₁ & EB₂ & P, V=EC₁ & EC₂, W=EB ₃ |EB ₄, X=(EC ₁ |EC ₂) & ((EB ₁ & (EB ₂ |W))|(EB ₂ & W)|P), Y=(X|V|U), ED=(C ₁ {circumflex over ( )}C ₂), R=PAVG(C ₁ ,C ₂)−((ED|Y) & ONE)−(U & V & ED & ONE).   (48) The solution in (47) requires 35 instructions, same as the conventional 35 instructions.

An approximate solution of (47) can be obtained with the assumption that the least significant bit of EB₁=EB₂=1, and EB₃ =EB ₄=0 is: R=PAVG(C ₁ ,C ₂)−((C ₁ {circumflex over ( )}C ₂)|EC ₁ |EC ₂) & ONE.   (49)

This solution requires 14 instructions, and produces a maximum error of ±1 in the final result for 9.38% of all possible values of A₁, . . . ,A₈ between [0,255]. We receive a computational advantage of 35:14.

The second approximate solution makes the assumption EB1=1, and EB2=0. It produces the following solution: Y=((EC ₁ |EC ₂) & (EB ₃ |EB ₄))|(EC ₁ & EC ₂), R=PAVG(C ₁ ,C ₂)−((C ₁ {circumflex over ( )}C ₂)|Y) & ONE.   (50)

This solution requires 20 instructions, and produces a maximum error of ±1 in the final result for 6.25% of all possible values of A₁, . . . ,A₈ between [0,255].

C. Type 3, Filter 3: R=(A₁+A₂+A₃+A₄+A₅+A₆+A₇+A₈+2*ONE)>>3

We require 35 instructions to compute this filter by conventional SIMD methods. For the new SIMD solution, we write the filter as: R=(((A ₁ +A ₂ +A ₃ +A ₄+ONE)>>2)+((A ₅ +A ₆ +A ₇ +A ₈+ONE)>>2)+E)>>1, where E is the error/correction term that is necessary for dividing up the expression into two parts each containing a Type 2, Filter 2 (27). We have: R=(C ₁ +C ₂+(E−E ₁ −E ₂)&ONE)>>1, (A ₁ +A ₂ +A ₃ +A ₄+ONE)>>2=C ₁−(E ₁ & ONE), (A ₅ +A ₆ +A ₇ +A8+ONE)>>2=C ₂−(E ₂ & ONE), E ₁ =EC ₁|(EB ₁ & EB ₂), E ₂ =EC ₂|(EB ₃ & EB ₄), P ₁=(EC ₁{circumflex over ( )}(EB ₁ & EB ₂)), P ₀=˜(EB ₁ {circumflex over ( )}EB ₂), Q ₁=(EC ₂{circumflex over ( )}(EB ₃ & EB ₄)), Q ₀=(EB ₃ {circumflex over ( )}EB ₄), E=(P ₁ & Q ₁)|(P ₀ & Q ₀ & (P ₁ |Q ₁)). Here E₁ and E₂ are error/correction terms obtained from (27). Defining E_(T)=(E−E₁−E₂)ε{−2, −1, 0}, we have the same expression for R as in (46), which we simplify as: S=(E ₁ {circumflex over ( )}E ₂), R=PAVG(C ₁ ,C ₂)−(˜(E & S) & (E ₁ |E ₂ |E)) & ONE−((C ₁ {circumflex over ( )}C ₂) & ˜(S{circumflex over ( )}E)) & ONE.   (51)

This solution can be further simplified as: P=EB ₁ |EB ₄, Q=EB ₃ |EB ₂, U=(EB ₂ & EB ₃ & P)|(EB ₄ & EB ₁ & Q), V=EC₁ & EC₂, W=P|Q, ED=(C ₁ {circumflex over ( )}C ₂), R=PAVG(C ₁ ,C ₂)−(ED|U|V|((EC ₁ |EC ₂) & W)) & ONE−ED & U & V & ONE.   (52) The solution in (52) requires 34 instructions, close to the conventional 35 instructions.

The approximate solution requires the assumption that the least significant bit of EB₁=1, and EB₂=EB₃=EB₄=0 is: R=PAVG(C ₁ ,C ₂)−((C ₁ {circumflex over ( )}C ₂)|EC ₁ |EC ₂) & ONE.   (53) This solution requires 14 instructions, and produces a maximum error of ±1 in the final result for 9.38% of all possible values of A₁, . . . ,A₈ between [0,255]. We receive a computational advantage of 35:14.

The second approximate solution makes the assumption EB₁=1, and EB₂=0. It produces the following solution: U=EB₃ & EB₄, ED=(C ₁ {circumflex over ( )}C ₂), R=PAVG(C ₁ ,C ₂)−(ED|U|EC ₁ |EC ₂) & ONE−ED & U & EC ₁ & EC ₂ & ONE.   (54) This solution requires 23 instructions, and produces a maximum error of ±1 in the final result for 6.25% of all possible values of A₁, . . . ,A₈ between [0,255]. D. Type 3, Filter 4: R=(A₁+A₂+A₃+A₄+A₅+A₆+A₇+A₈+ONE)>>3

We require 35 instructions to compute this filter by conventional SIMD methods. For the new SIMD solution, we write the filter as: R=(((A ₁ +A ₂ +A ₃ +A ₄+ONE)>>2)+((A ₅ +A ₆ +A ₇ +A ₈)>>2)+E)>>1, where E is the error/correction term that is necessary for dividing up the expression into two parts each containing a Type 2, Filter. We have: R=(C ₁ +C ₂+(E−E ₁ −E ₂)&ONE)>>1, (A ₁ +A ₂ +A ₃ +A ₄+ONE)>>2=C ₁−(E ₁ & ONE), (A ₅ +A ₆ +A ₇ +A ₈)>>2=C ₂−(E ₂ & ONE), E ₁ =EC ₁|(EB ₁ & EB ₂), E ₂ =EC ₂ |EB ₃ |EB ₄, P ₁=(EC ₁{circumflex over ( )}(EB ₁ & EB ₂)), P ₀=˜(EB ₁ {circumflex over ( )}EB ₂), Q ₁=(EC ₂{circumflex over ( )}(EB ₃ |EB ₄)), Q ₀=(EB ₃ {circumflex over ( )}EB ₄), E=(P ₁ & Q ₁)|(P ₀ & Q ₀ & (P ₁ |Q ₁)) Here E₁ and E₂ are error/correction terms obtained from (27) and (30) respectively. Defining ET=(E−E₁−E₂)ε{−2, −1, 0}, we have the same expression for R as in (46), which we simplify as: S=(E ₂ {circumflex over ( )}E), R=PAVG(C ₁ ,C ₂)−(E ₁ |s) & ONE−((C ₁ {circumflex over ( )}C ₂) & ˜(E ₁ {circumflex over ( )}S)) & ONE,   (55) This solution can be further simplified as: P=EB₃ & EB₄, Q=EB ₃ |EB ₄, U=(EB ₁ & (EB ₂ |Q))|(EB ₂ & Q)|P, V=EB₁ & EB₂ & P, W=EC ₁ |EC ₂, Z=(EC ₁ & EC ₂ & U), ED=(C₁ {circumflex over ( )}C ₂), R=PAVG(C₁ {circumflex over ( )}C ₂)−(ED|U|W) & ONE−ED & ((W & V) & ONE.   (56) The solution in (56) requires 35 instructions, same as the conventional 35 instructions. The approximate solution requires the assumption that the least significant bit of EB₁=EB₂=0, and EB₃=EB₄=1 is: R=PAVG(C₁ ,C ₂)−ONE−((C ₁ {circumflex over ( )}C ₂) & EC ₁ & EC ₂) & ONE.   (57) This solution requires 15 instructions, and produces a maximum error of ±1 in the final result for 9.38% of all possible values of A₁, . . . ,A₈ between [0,255]. We receive a computational advantage of 35:15.

The second approximate solution makes the assumption EB₁=1, and EB₂=0. It produces the following solution: Q=EB ₃ |EB ₄, Z=(EC ₁ & EC ₂ & Q), ED=(C ₁ {circumflex over ( )}C ₂), R=PAVG(C ₁ ,C ₂)−((ED|Q|EC ₁ |EC ₂) & ONE)−(ED & Z & ONE).   (58) This solution requires 23 instructions, and produces a maximum error of ±1 in the final result for 6.25% of all possible values of A₁, . . . ,A₈ between [0,255]. E. Type 3, Filter 5: R=(A₁+A₂+A₃+A₄+A₅+A₆+A₇+A₈)>>3

We require 33 instructions to compute this filter by conventional SIMD methods. For the new SIMD solution, we write the filter as: R=(((A ₁ +A ₂ +A ₃ +A ₄ )>>2)+((A ₅ +A ₆ +A ₇ +A ₈)>>2)+E)>>1, where E is the error/correction term that is necessary for dividing up the expression into two parts each containing a Type 2, Filter (30). We have: R=(C ₁ +C ₂+(E−E ₁ −E ₂)&ONE)>>1, (A ₁ +A ₂ +A ₃ +A ₄)>>2=C ₁−(E ₁ & ONE), (A ₅ +A ₆ +A ₇ +A ₈)>>2=C ₂−(E ₂ & ONE), E ₁ =EC ₁ |EB ₁ |EB ₂ , E ₂ =EC ₂ |EB ₃ |EB ₄, P ₁=(EC ₁{circumflex over ( )}(EB ₁ |EB ₂)), P ₀=(EB ₁ {circumflex over ( )}EB ₂), Q ₁=(EC ₂{circumflex over ( )}(EB ₃ |EB ₄)), Q ₀=(EB ₃ {circumflex over ( )}EB ₄), E=(P ₁ & Q ₁)|(P ₀ & Q ₀ & (P ₁ |Q ₁)). Here E₁ and E₂ are error/correction terms obtained from (27) and (30) respectively. Defining ET=(E−E₁−E₂)ε{−2, −1, 0}, we have the same expression for R as in (46), which we simplify as: R=PAVG(C ₁ ,C ₂)−(E ₁ |E ₂) & ONE−((C ₁ {circumflex over ( )}C ₂) & ˜(E ₁ {circumflex over ( )}E ₂ {circumflex over ( )}E)) & ONE,   (59) This solution can be simplified as: P=EB ₁ |EB ₄, Q=EB ₃ |EB ₂, U=P|Q, V=(EB ₂ & EB ₃ & P)|(EB ₄ & EB ₁ & Q), W=EC ₁ |EC ₂, Z=(EC ₁ & EC ₂ & U), ED=(C ₁ {circumflex over ( )}C ₂), R=PAVG(C ₁ ,C ₂)−((ED|U|W) & ONE)−(ED & ((W & V) & ONE).   (60) The solution in (59) requires 34 instructions, close to the conventional 35 instructions.

The approximate solution requires the assumption that the least significant bit of EB₁=1, and EB₂=EB₃=EB₄=0 is: R=PAVG(C ₁ ,C ₂)−ONE−(C ₁ {circumflex over ( )}C ₂) & EC ₁ & EC ₂ & ONE.   (61) This solution requires 15 instructions, and produces a maximum error of ±1 in the final result for 9.38% of all possible values of A₁, . . . ,A₈ between [0,255]. We receive a computational advantage of 33:15.

The second approximate solution makes the assumption EB1=1, and EB2=0. It produces the following solution: W=EC ₁ |EC ₂, R=PAVG(C ₁ ,C ₂)−ONE−((C ₁ {circumflex over ( )}C ₂) & ((W & EB ₃ & EB ₄)|(EC ₁ & EC ₂)) & ONE).   (62) This solution requires 21 instructions, and produces a maximum error of ±1 in the final result for 6.25% of all possible values of A₁, . . . ,A₈ between [0,255]. F. Type 3. Special Filter 1: R=(A₁+2A₃+2A₅+2A₇+A₂+4*ONE)>>3

This filter is an important loop filter for de-blocking in JVT video compression standards.

i. Conventional SIMD Solution

This filter can be implemented in SIMD architecture (assuming sufficient memory) by using the following steps:

-   -   1. (5 Instructions) A_(iL)=Unpack Low 4 Bytes of A_(i), for i         ε{1,2,3,5,7},     -   2. (5 Instructions) A_(iH)=Unpack High 4 Bytes of A_(i), for i         ε{1,2,3,5,7},     -   3. (9 Instructions) Add and Shift lower 4 words of A₁, . . . ,A₅         to obtain lower 4 words of R_(L) as:         R _(L)=(A _(1L)+2A _(3L)+2A _(5L)+2A _(7L) +A _(2L)+4*ONE₄)>>3,     -   4. (9 Instructions) Add and Shift higher 4 words of A₁, . . .         ,A₅ to obtain higher 4 words of R_(H) as:         R _(H)=(A _(1H)+2A _(3H)+2A _(5H)+2A _(7H) +A _(2H)+4*ONE₄)>>3,     -   5. (1 Instruction) Pack R_(H) and R_(L) into final register R.         We require 29 instructions to compute this filter by         conventional SIMD methods.         ii. Efficient SIMD Solution

From (34), we get the: B ₁ =PAVG(A ₁ ,A ₂), B ₂ =A ₃ , B ₃ =A ₅ , B ₄ =A ₇, C ₁ =PAVG(B ₁ ,A ₃), C ₂ =PAVG(A ₅ ,A ₇), EB ₁=(A ₁ {circumflex over ( )}A ₂), EB ₂=0, EB ₃=0, EB ₄=0, EC ₁=(B ₁ {circumflex over ( )}A ₃), EC ₂=(A ₅ {circumflex over ( )}A ₇)   (63) In (43) we get: R=PAVG(C ₁ ,C ₂)−((C ₁ {circumflex over ( )}C ₂)|(EC ₁ & EC ₂ & EB ₁)) & (EC ₁ |EC ₂ |EB ₁) & ONE.   (64) The solution in (64) requires 16 instructions with a computational benefit of 29:16. iii. Approximate SIMD Solution

The approximate solution with the assumptions that the least significant bit of EB₁=EC₁=0, and EC₂=1 is: R=PAVG(C ₁ ,C ₂)−(C ₁ {circumflex over ( )}C ₂) & ONE.   (65) It requires 7 instructions, and produces a maximum error of ±1 in the final result for 12.5% of all possible values of A₁, . . . ,A₈ between [0,255]. The computational advantage is 29:7 (approx. 4 times speedup). G. Type 3, Special Filter 2: R=(A₁+A₂+A₃+3A₄+2A₇+4*ONE)>>3

This filter is also an important loop filter for de-blocking in in the JVT video compression standard.

i. Conventional SIMD Solution

This filter can be implemented in SIMD architecture (assuming sufficient memory) by using the following steps:

-   -   1. (5 Instructions) A_(iL)=Unpack Low 4 Bytes of A_(i), for i         ε{1,2,3,4,7},     -   2. (5 Instructions) A_(iH)=Unpack High 4 Bytes of A_(i), for i         ε{1,2,3,4,7},     -   3. (8 Instructions) Add and Shift lower 4 words of A₁, . . . ,A₅         to obtain lower 4 words of R_(L) as:         R _(L)=(A _(1L) +A _(2L) +A _(3L)+3A _(4L)+2A _(7L)+4*ONE₄)>>3,     -   4. (8 Instructions) Add and Shift higher 4 words of A₁, . . .         ,A₅ to obtain higher 4 words of R_(H) as:         R _(H)=(A _(1H) +A _(2H) +A _(3H)+3A _(4H)+2A _(7H)+4*ONE₄)>>3,     -   5. (1 Instruction) Pack R_(H) and R_(L) into final register R.

We require 27 instructions (including two multiplications by 3) to compute this filter by conventional SIMD methods.

ii. Efficient SIMD Solution

From (34), we get the: B ₁ =PAVG(A ₁ ,A ₂), B ₂ =PAVG(A ₃ ,A ₄), B ₃ =A ₄ , B ₄ =A ₇, C ₁ =PAVG(B ₁ ,B ₂), C ₂ =PAVG(A ₄ ,A ₇), EB ₁=(A ₁ {circumflex over ( )}A ₂), EB ₂=(A ₃ {circumflex over ( )}A ₄), EB ₃=0, EB ₄=0, EC ₁=(B ₁ {circumflex over ( )}B ₂), EC ₂=(A ₄ {circumflex over ( )}A ₇).   (66) In (43) we get: S=(EB ₁ |EB ₂), R=PAVG(C ₁ ,C ₂)−((C ₁ {circumflex over ( )}C ₂)|(EC ₁ & EC ₂ & S)) & (EC ₁ |EC ₂ |S) & ONE.   (67) The solution in (65) requires 19 instructions with a computational benefit of 27:19. iii. Approximate SIMD Solution

The first approximate solution with the assumptions that the least significant bit of EC₁=EC₂=1, and EB₁=EB₂=0 is: R=PAVG(C ₁ ,C ₂)−(C ₁ {circumflex over ( )}C ₂) & ONE.   (68) It requires 8 instructions, and produces a maximum error of ±1 in the final result for 12.5% of all possible values of A₁, . . . ,A₈ between [0,255]. The computational advantage is 27:8.

The next approximate solution is with the assumption that the last bit of EB₁=EB₂=1, which gives us: R=PAVG(C ₁ ,C ₂)−((C ₁ {circumflex over ( )}C ₂)|(EC ₁ & EC ₂)) & ONE.   (69) This solution requires 12 instructions and produces a maximum error of ±1 in the final result for 6.25% of all possible values of A₁, . . . , A₈ between [0,255]. The computational advantage is 27:12. H. Type 3, Special Filter 3: R=(A₁+A₂+2A₄+A₅+A₆+A₇+4*ONE)>>3

This filter is used for de-blocking in post-processing.

i. Conventional SIMD Solution

This filter can be implemented in SIMD architecture (assuming sufficient memory) by using the following steps:

-   -   1. (7 Instructions) A_(iL)=Unpack Low 4 Bytes of A_(i), for i         ε{1,2,3,4,5,67},     -   2. (7 Instructions) A_(iH)=Unpack High 4 Bytes of A_(i), for i         ε{1,2,3,4,5,67},     -   3. (9 Instructions) Add and Shift lower 4 words of A₁, . . . ,A₅         to obtain lower 4 words of R_(L) as:         R _(L)=(A _(1L) +A _(2L) +A _(3L)+2A _(4L) +A _(5L) +A _(6L) +A         _(7L)+4*ONE₄)>>3     -   4. (9 Instructions) Add and Shift higher 4 words of A₁, . . .         ,A₅ to obtain higher 4 words of R_(H) as:         R _(H)=(A _(1H) +A _(2H) +A _(3H)+2A _(4H) +A _(5H) +A _(6H) +A         _(7H)+4*ONE₄)>>3     -   5. (1 Instruction) Pack R_(H) and R_(L) into final register R.         We require 33 instructions to compute this filter by         conventional SIMD methods.         ii. Efficient SIMD Solution

From (34), we get: B ₁ =PAVG(A ₁ ,A ₂), B ₂ =PAVG(A ₃ ,A ₅), B ₃ =PAVG(A ₆ ,A ₇), B ₄ =A ₄, C ₁ =PAVG(B ₁ ,B ₂), C ₂ =PAVG(B ₃ ,A ₄), EB ₁=(A ₁ {circumflex over ( )}A ₂), EB ₂=(A ₃ {circumflex over ( )}A ₄), EB ₃=(A ₆ {circumflex over ( )}A ₇), EB ₄=0, EC ₁=(B ₁ {circumflex over ( )}B ₂), EC ₂=(B ₃ {circumflex over ( )}A ₄)   (70) In (43) we get: U=EC ₁ |EC ₂, V=EB ₁ |EB ₂, X=V|EB ₃, Y=U|X, Z=(EC ₁ & EC ₂ & X), T=U & V & EB ₁ & EB ₂ & EB ₃, R=PAVG(C ₁ ,C ₂)−((C ₁ {circumflex over ( )}C ₂)|Z|T) & Y & ONE,   (71) The solution in (71) requires 27 instructions with a computational benefit of 33:27. iii. Approximate SIMD Solution

We get an approximate solution with the assumptions that the least significant bit of EB₂=1, and EB₂=EB₃=0 as: R=PAVG(C ₁ ,C ₂)−((C ₁ {circumflex over ( )}C ₂)|(EC ₁ & EC ₂)) & ONE.   (72) The solution in (72) requires 13 instructions, and produces a maximum error of ±1 in the final result for 6.25% of all possible values of A₁, . . . ,A₇ between [0,255]. The computational advantage is 33:13. I. Type 3, Summary of Results

Table V below summarizes the instructions required to compute each filter (given sufficient memory) by the efficient and conventional SIMD methods. For the Efficient case, we give the instructions required for the exact and approximate solutions.

Summary of Results for Type 3 FIR Filters

TABLE V Efficient Conventional Method Speedup Type 3 Filters Method Exact Approx. Exact Approx. (A₁ + A₂ + . . . + 35 32 14 1.1 2.5 A₈ + 4 * ONE) >> 3 (A₁ + A₂ + . . . + 35 35 14 1.0 2.5 A₈ + 3 * ONE) >> 3 (A₁ + A₂ + . . . + 35 34 14 1.0 2.5 A₈ + 2 * ONE) >> 3 (A₁ + A₂ + . . . + 35 35 15 1.0 2.3 A₈ + 1 * ONE) >> 3 (A₁ + A₂ + . . . + 33 34 15 1.0 2.2 A₈) >> 3 (A₁ + 2A₃ + 2A₅ + 29 16 7 1.8 4.1 2A₇ + A₂ + 4 * ONE) >> 3 (A₁ + A₂ + A₃ + 27 19 8 1.4 3.4 3A₄ + 2A₇ + 4 * ONE) >> 3 (A₁ + A₂ + A₃ + 33 27 13 1.2 2.5 2A₄ + A₅ + A₆ + A₇ + 4 * ONE) >> 3

The shaded areas show significant improvements in efficiency due to the analyses developed here.

4. Type 4 FIR Filters

There are 9 different Type 4 FIR filters depending on the 9 choices of c in (9). For the sake of brevity, we shall only discuss the case of c=8. We define the following packed 64-bit registers, each containing 8 data elements of one byte each: B ₁ =PAVG(A ₁ ,A ₂), B ₂ =PAVG(A ₃ ,A ₄), B ₃ =PAVG(A ₅ ,A ₆), B ₄ =PAVG(A ₇ ,A ₈), B ₅ =PAVG(A ₉ ,A ₁₀), B ₆ =PAVG(A ₁₁ ,A ₁₂), B ₇ =PAVG(A ₁₃ ,A ₁₄), B ₈ =PAVG(A ₁₅ ,A ₁₆), C ₁ =PAVG(B ₁ ,B ₂), C ₂ =PAVG(B ₃ ,B ₄), C ₃ =PAVG(B ₅ ,B ₆), C ₄ =PAVG(B ₇ ,B ₈), D ₁ =PAVG(C ₁ ,C ₂), D ₂ =PAVG(C ₃ ,C ₄), EB ₁=(A ₁ {circumflex over ( )}A ₂), EB ₂=(A ₃ {circumflex over ( )}A ₄), EB ₃=(A ₅ {circumflex over ( )}A ₆), EB ₄=(A ₇ {circumflex over ( )}A ₈) EB ₅=(A ₉ {circumflex over ( )}A ₁₀), EB ₆=(A ₁₁ {circumflex over ( )}A ₁₂), EB ₇=(A ₁₃ {circumflex over ( )}A ₁₄), EB ₈=(A ₁₅ {circumflex over ( )}A ₁₆), EC ₁=(B ₁ {circumflex over ( )}B ₂), EC ₂=(B ₃ {circumflex over ( )}B ₄), EC ₃=(B ₅ {circumflex over ( )}B ₆), EC ₄=(B ₇ {circumflex over ( )}B ₈), ED ₁=(C ₁ {circumflex over ( )}C ₂), ED ₂=(C ₃ {circumflex over ( )}C ₄), E ₁ =EC ₁ & (EB ₁ |EB ₂), E ₂ =EC ₂ & (EB ₃ |EB ₄), E ₃ =EC ₃ & (EB ₅ |EB ₆), E ₄ =EC ₄ & (EB ₇ |EB ₈), P ₁=(EC ₁{circumflex over ( )}(EB ₁ |EB ₂)), P ₀=(EB ₁ {circumflex over ( )}EB ₂), Q ₁=(EC ₂ {circumflex over ( )}˜( EB ₃ |EB ₄)), Q ₀=(EB ₃ {circumflex over ( )}EB ₄), ER ₁=(P ₁ & Q ₁)|((P ₁ |Q ₁) & P ₀ & Q ₀), R ₁=(EC ₃{circumflex over ( )}˜(EB ₅ |EB ₆)), R ₀=(EB ₅ {circumflex over ( )}EB ₆), S ₁=(EC ₄{circumflex over ( )}·(EB ₇ |EB ₈)), S ₀=(EB ₇{circumflex over ( )}EB₈), ER ₂=(R ₁ & S₁)|((R ₁ |S ₁) & R ₀ & S₀), U ₂ =ED ₁ {circumflex over ( )}E ₁ {circumflex over ( )}E ₂{circumflex over ( )}((P ₁ & Q ₁)|((P ₁ |Q ₁) & P ₀ & Q ₀)), U ₁ =P ₁ {circumflex over ( )}Q ₁{circumflex over ( )}(P ₀ & Q ₀), U₀=P₀{circumflex over ( )}Q₀, V ₂ =ED ₂ {circumflex over ( )}E ₃ {circumflex over ( )}E ₄{circumflex over ( )}((R ₁ & S ₁)|((R ₁ |S ₁) & R ₀ & S ₀)), V ₁ =R ₁ {circumflex over ( )}S ₁{circumflex over ( )}(R ₀ & S ₀), V₀=R₀{circumflex over ( )}S₀, E=(U ₂ & V ₂)|((U ₂ |V ₂) & U ₁ & V ₁)|((U ₂ |V ₂) & (U ₁ |V ₁) & U ₀ & V ₀), ET ₁=(ED|(E ₁ {circumflex over ( )}E ₂ {circumflex over ( )}ER ₁)) & (E ₁ 51 E ₂ |˜ER ₁), ET ₂=(ED ₂|(E ₃ {circumflex over ( )}E ₄ {circumflex over ( )}ER ₂)) & (E ₃ |E ₄ |˜ER ₂)   (73) A. Type 4, Filter 1: R=(A₁+A₂+ . . . +A₁₅+A₁₆+8*ONE)>>4 i. Conventional SIMD Solution

This filter can be implemented in SIMD architecture (assuming sufficient memory) by using the following steps:

-   -   1. (16 Instructions) A_(iL)=Unpack Low 4 Bytes of A_(i), for         i=1, . . . ,16,     -   2. (16 Instructions) A_(iH)=Unpack High 4 Bytes of A_(i), for         i=1, . . . ,16, R _(L) as:         R _(L)=(A _(1L) +A _(2L) + . . . +A _(15L) +A _(16L)+4*ONE₄)>>4,     -   4. (17 Instructions) Add and Shift higher 4 words of A₁, . . .         ,A₁₆ to obtain higher 4 words of R_(H) as:         R _(H)=(A _(1H) +A _(2H) + . . . +A _(15H) +A _(16H)+4*ONE4)>>4,     -   5. (1 Instruction) Pack R_(H) and R_(L) into final register R.         We require 67 instructions to compute this filter by         conventional SIMD methods.         ii. Efficient SIMD Solution

In order to implement this filter efficiently, we simplify it as follows: R=((A ₁ +A ₂ + . . . +A ₇ +A ₈+4*ONE)>>3+(A ₉ +A ₁₀ + . . . +A ₁₅ +A ₁₆+4*ONE)>>3+E)>>1,   (74) where E is the error/correction term that is necessary for dividing up the expression into two parts each containing a Type 3, Filter 1 (42). Note that according to (42) and the registers in (73), we have: (A ₁ +A ₂ + . . . +A ₇ +A ₈+4*ONE)>>3=D ₁−(ET ₁ & ONE), (A ₉ +A ₁₀ + . . . +A ₁₅ +A ₁₆+4*ONE)>>3=D ₂−(ET ₂ & ONE),   (75) where ET₁ and ET₂ are error/correction terms obtained in (42). We can simplify (74) as: R=(D ₁ +D ₂+(E−ET ₁ −ET ₂)&ONE)>>1.   (76) Note that the expressions for E, ET₁, and ET₂ are given in (73). We note that E, ET₁, ET₂ ε{0, 1}, and E_(T)=(E−ET₁−ET₂) ε{−2, −1, 0, 1}. From (76), we have: $\begin{matrix} {R = \left\{ {\begin{matrix} {{{{{PAVG}\left( {D_{1,}D_{2}} \right)} - {ONE} - \left( {{D_{1}}^{\hat{}}D_{2}} \right)}\&}\quad{ONE}} & {{{when}\quad E_{T}} = {- 2}} \\ {{{PAVG}\left( {D_{1},D_{2}} \right)} - {ONE}} & {{{when}\quad E_{T}} = {- 1}} \\ {{{{{PAVG}\left( {D_{1},D_{2}} \right)} - \left( {{D_{1}}^{\hat{}}D_{2}} \right)}\&}\quad{ONE}} & {{{when}\quad E_{T}} = 0} \\ {{PAVG}\left( {D_{1},D_{2}} \right)} & {{{when}\quad E_{T}} = 1} \end{matrix}.} \right.} & (70) \end{matrix}$ We simplify (77) as: R=PAVG(D ₁ ,D ₂)−((ET ₁ & ET ₂)|˜E) & (ET ₁ |ET ₂ |E) & ONE −(D ₁ {circumflex over ( )}D ₂) & (ET ₁ {circumflex over ( )}ET ₂ {circumflex over ( )}E) & ONE.   (78) We can further simplify (78) as:

-   -   U₁=At least 1 ED,     -   U₂=At least 1 EC,     -   U₃=At least 1 EB,     -   U₄=Both EDs,     -   U₅=At least 2 ECs,     -   U₆=At least 3 ECs,     -   U₇=All 4 ECs,     -   U₈=At least 3 EBs,     -   U₉=At least 5 EBs,     -   U₁₀=At least 7 EBs,     -   U₁₁=At least 1 ED, EC or EB,         E ₁=(EX & U ₁₁)|(U ₄ & (U ₂ |U ₃))|(U ₁ & U ₆)|(U ₁ & U ₅ & U         ₃)|(U ₁ & U ₂ & U ₈)|(U ₁ & U ₉)|(U ₇ & U ₃)|(U ₆ & U8)|(U ₅ & U         ₉)|(U ₂ & U₁₀),         E ₂=(EX & U ₄ & ((U ₇ & U ₃)|(U ₆ & U ₈)|(U ₅ & U ₉)|(U ₂ & U         ₁₀)))|(EX & U ₁ & ((U ₇ & U ₉)|(U ₆ & U ₁₀)),   E =El+E₂. (79)

Clearly, (79) is an inefficient solution and is useful in special cases and for approximate solutions only.

iii. Approximate SIMD Solution

We have many approximate solutions by assuming the least significant bit of EB₁, . . . , EB₈, EC₁, . . . EC₄, ED₁, or ED₂ as 0 or 1. With the assumption the last bit of E=ET₁=ET₂=1, we get from (78): R=PAVG(D ₁ ,D ₂)−ONE.   (80)

This solution requires 16 instructions, and produces a maximum error of ±1 in the final result for 8.6% of all possible values of A₁, . . . ,A₁₆ between [0,255]. The error never exceeds ±1. We receive a computational advantage of 67:16, and approximate 4 times speedup.

B. Type 4, Special Filter 1: R=(A₁+4A₂+6A₃+4A₄+A₅+8*ONE)>>4

This filter is a Gaussian approximation filter used for post-processing.

i. Conventional SIMD Solution

This filter can be implemented in SIMD architecture (assuming sufficient memory) by using the following steps:

-   -   1. (5 Instructions) A_(iL)=Unpack Low 4 Bytes of A_(i), for i         ε{1,2,3,4,5},     -   2. (5 Instructions) A_(iH)=Unpack High 4 Bytes of A_(i), for i         ε{1,2,3,4,5},     -   3. (9 Instructions) Add and Shift lower 4 words of A₁, . . . ,         A₅ to obtain lower 4 words of R_(L) as:         R _(L)=(A _(1L)+4A _(2L)+6A _(3L)+4A _(4L) +A _(5L)+8*ONE₄)>>4,     -   4. (9 Instructions) Add and Shift higher 4 words of A₁, . . . ,         A₅ to obtain higher 4 words of R_(H) as:         R _(H)=(A _(1H)+4A _(2H)+6A _(3H)+4A _(4H) +A _(5H)+8*ONE₄)>>4,     -   5. (1 Instruction) Pack R_(H) and R_(L) into final register R.         We require 29 instructions to compute this filter by         conventional SIMD methods.         ii. Efficient SIMD Solution

From (73), we get the: B ₁ =PAVG(A ₁ ,A ₂), B ₂ =A ₃ , B ₃ =A ₃ , B ₄ =A ₃ , B ₅ =A ₄ , B ₆=A₄ , B ₇ =A ₅ , B ₈ =A ₅, C ₁ =PAVG(B ₁ ,A ₃), C ₂ =A ₃ , C ₃ =A ₄ , C ₄ =A ₅, D ₁ =PAVG(C ₁ ,A ₃), D ₂ =PAVG(A ₄ ,A ₅), EB ₁ =A ₁ {circumflex over ( )}A ₂ , EB ₂ =EB ₃ =EB ₄ =EB ₅ =EB ₆ =EB ₇ =EB ₈=0, EC ₁=(B ₁ {circumflex over ( )}A ₃), EC ₂ =EC ₃ =EC ₄=0, ED ₁ =C ₁ {circumflex over ( )}A ₃ , ED ₂ =A ₄ {circumflex over ( )}A ₅, E ₁ =EC ₁ & EB ₁ , E ₂ =E ₃ =E ₄=0, P ₁ =EC ₁ {circumflex over ( )}˜EB ₁ , P ₀ =EB ₁ , Q ₁=1, Q ₀=0, ER ₁ =P _(1,) R ₁=1, R ₀=0, S ₁=1, S ₀=0, ER ₂=1, U ₂ =ED ₁ {circumflex over ( )}E ₁ {circumflex over ( )}P ₁ , U ₁ =˜P ₁ , U ₀ =P ₀, V ₂ =˜ED ₂ , V ₁=0, V ₀=0, E=U₂ & V₂, ET ₁=(ED ₁|(E ₁ {circumflex over ( )}ER ₁)), ET ₂=0.   (81) From (78) we get: R=PAVG(D ₁ ,D ₂)−(˜E & ET ₁ & ONE)−(D ₁ {circumflex over ( )}D ₂) & (ET ₁ {circumflex over ( )}E) & ONE.   (82) We can simplify (82) as follows: U=EC ₁ |EB ₁, R=PAVG(D ₁ ,D ₂)−(((D ₁ {circumflex over ( )}D ₂) & (ED ₁ |ED ₂ |U))|(ED ₁ & ED ₂ & U)) & ONE.   (83) The solution in (83) requires 19 instructions with a 29:19 computational advantage. iii. Approximate SIMD Solution

We can assume the least significant bit of ED₁, ED₂, EC₁, or EB₁ as 0 or 1 to get several approximate solutions. We first make the assumption that the least significant bit of ED₁=1, and ED₂=EC₁=EB₁=0, to get the following solution: R=PAVG(D ₁ ,D ₂)−(D ₁ {circumflex over ( )}D ₂) & ONE.   (84) This solution requires 8 instructions, and produces a maximum error of ±1 for 12.5% of all possible values of A₁, . . . ,A₅ between [0,255]. The computational advantage is 29:8 (more than 3 times speedup).

The second approximate solution makes the assumption that the least significant bit of EC₁=1, and EB₁=0, to get the solution: R=PAVG(D ₁ ,D ₂)−((D ₁ {circumflex over ( )}D ₂)|(ED ₁ & ED ₂)) & ONE.   (85) This solution requires 12 instructions, and produces a maximum error of ±1 for 6.25% of all possible values of A₁, . . . ,A₅ between [0,255]. The computational advantage is 29:12. C. Type 4, Special Filter 2: R=(A₁+A₂+2A₅+2A₆+2A₇+2A₈+4A₉A₃+A₄+8*ONE)>>4

This filter is also a Gaussian approximation filter used for post-processing.

i. Conventional SIMD Solution

This filter can be implemented in SIMD architecture (assuming sufficient memory) by using the following steps:

-   -   1. (9 Instructions) A_(iL)=Unpack Low 4 Bytes of A_(i), for i         ε{1,2, . . . ,9},     -   2. (9 Instructions) A_(iH)=Unpack High 4 Bytes of A_(i), for i         ε{1,2, . . . ,9},     -   3. (15 Instructions) Add and Shift lower 4 words of A₁, . . . ,         A₅ to obtain lower 4 words of R_(L) as:         R_(L)=(A _(1L) +A _(2L)+2A _(5L)+2A _(6L)+2A _(7L)+2A _(8L)+4A         _(9L) +A _(3L) +A _(4L)+8*ONE)>>4,     -   4. (15 Instructions) Add and Shift higher 4 words of A₁, . . . ,         A₅ to obtain higher 4 words of R_(H) as:         R _(H)=(A _(1H) +A _(2H)+2A _(5H)+2A _(6H)+2A _(7H)+2A _(8H)+4A         _(9H)+A_(3H) +A _(4H)+8*ONE)>>4,     -   5. (1 Instruction) Pack R_(H) and R_(L) into final register R.         We require 49 instructions to compute this filter by         conventional SIMD methods.         ii. Efficient SIMD Solution

From (73), we get the: B ₁ PAVG(A ₁ ,A ₂), B ₂ =PAVG(A ₃ ,A ₄), B ₃ =A ₅ , B ₄ =A ₆ , B ₅ =A ₇ , B ₆ =A ₈ , B ₇ =A ₉ , B ₈ =A ₉, C ₁ =PAVG(B ₁ ,B ₂), C ₂ =PAVG(A ₅ ,A ₆), C ₃ =PAVG(A ₇ ,A ₈), C ₄ =A ₉, D ₁ =PAVG(C ₁ ,C ₂), D ₂ =PAVG(C ₃ ,A ₉), EB ₁=(A ₁ {circumflex over ( )}A ₂), EB ₂=(A ₃ {circumflex over ( )}A ₄), EB ₃ =EB ₄ =EB ₅ =EB ₆ =EB ₇ =EB ₈=0, EC ₁=(B ₁ {circumflex over ( )}B ₂), EC ₂=(A ₅ {circumflex over ( )}A ₆), EC ₃=(A ₇{circumflex over ( )}A₈), EC ₄=0, ED ₁=(C ₁ {circumflex over ( )}C ₂), ED ₂=(C ₃ {circumflex over ( )}A ₉), E ₁ =EC ₁ & (EB ₁ |EB ₂), E ₂ =E ₃ =E ₄=0, P ₁ =EC ₁{circumflex over ( )}˜(EB ₁ |EB ₂), P ₀=(EB ₁ {circumflex over ( )}EB ₂), Q ₁ =˜EC ₂ , Q ₀=0, ER ₁ =P ₁ & Q ₁, R ₁ =˜EC ₃ , R ₀=0, S ₁=1, S ₀=0, ER ₂ =R ₁, U ₂ =ED ₁ {circumflex over ( )}E ₁{circumflex over ( )}(P ₁ & Q ₁), U ₁ =P ₁ {circumflex over ( )} Q ₁ , U ₀ =P ₀, V ₂ =ED ₂ {circumflex over ( )}R ₁ , V ₁ =˜R ₁ , V ₀=0, E=(U ₂ & V ₂)|((U ₂ |V ₂) & U ₁ & V ₁), ET ₁=(ED ₁|(E ₁ {circumflex over ( )}ER ₁)) & (E ₁ |˜ER ₁), ET ₂=(ED ₂ & ˜ER ₂).   (86)

The final solution is same as (78). We can simplify this solution as follows: U=EB ₁ |EB ₂, V=EC ₁ |EC ₃, W=EC ₂ |U|V, Z=ED ₁ |ED ₂, F=Z|W, H=EC₁ & EC₃, G=(EC ₂& V)|H, R=PAVG(D ₁ ,D ₂)−(((D₁ {circumflex over ( )}D ₂)&F)|(ED ₁&ED ₂&W)|(Z & ((EC ₂&H)|(G&U)))) & ONE.   (87)

The solution in (87) requires 36 instructions with a 49:36 computational advantage.

iii. Approximate SIMD Solution

We suggest 2 approximate solutions for this filter. For the first approximate solution, we assume the least significant bit of EC₃=0, and EB₁=EB₂=1 to get the following: R=PAVG(D ₁ ,D ₂)−((D ₁ {circumflex over ( )}D ₂)|(ED ₁&ED ₂)|((ED ₁ |ED ₂) & EC ₁ & EC ₂)) & ONE.   (88) This solution requires 21 instructions, and produces a maximum error of ±1 for 6.25% of all possible values of A₁, . . . ,A₉ between [0,255]. The computational advantage is 49:21 (more than 2 times speedup).

The second approximate solution makes the assumption that the least significant bit of EB₁=EB₂=1. We get the solution: U=(EC ₁ & (EC ₂ |EC ₃))|(EC ₂ & EC ₃), R=PAVG(D ₁ ,D ₂)−((D ₁ {circumflex over ( )}D ₂)|(ED ₁&ED ₂)|((ED ₁ |ED ₂) & U)) & ONE.   (89) This solution requires 25 instructions, and produces a maximum error of ±1 for 3.12% of all possible values of A₁, . . . ,A₉ between [0,255]. The computational advantage is 49:25 (nearly 2 times speedup). D. Type 4, Special Filter 3: R=(A₁+2A₂+2A₄+2A₄+2A₅+2A₆+2A₇+2A₈+A₉+8*ONE)>>4

This filter is also used for post-processing.

i. Conventional SIMD Solution

This filter can be implemented in SIMD architecture (assuming sufficient memory) by using the following steps:

-   -   1. (9 Instructions) A_(iL)=Unpack Low 4 Bytes of A_(i), for i         ε{1,2, . . . ,9},     -   2. (9 Instructions) A_(iH)=Unpack High 4 Bytes of A_(i), for i         ε{1,2, . . . ,9},     -   3. (17 Instructions) Add and Shift lower 4 words of A₁, . . . ,         A₅ to obtain lower 4 words of R_(L) as:         R _(L)=(A _(1L)+2A _(2L)+2A _(3L)+2A _(4L)+2A _(5L)+2A _(6L)+2A         _(7L)+2A _(8L) +A _(9L)+8*ONE)>>4,     -   4. (17 Instructions) Add and Shift higher 4 words of A₁, . . . ,         A₅ to obtain higher 4 words of R_(H) as:         R _(H)=(A _(1H)+2A _(2H)+2A _(3H)+2A _(4H)+2A _(5H)+2A _(6H)+2A         _(7H)+2A _(8H) +A _(9H)+8*ONE)>>4,     -   5. (1 Instruction) Pack R_(H) and R_(L) into final register R.         We require 53 instructions to compute this filter by         conventional SIMD methods.         ii. Efficient SIMD Solution

From (73), we get the: B ₁ =PAVG(A ₁ ,A ₂), B ₂ =A ₂ , B ₃ =A ₃ , B ₄ =A ₄ , B ₅ =A ₅ , B ₆ =A ₆ , B ₇ =A ₇ , B ₈ =A ₈, C ₁ =PAVG(B ₁ ,A ₂), C ₂ =PAVG(A ₃ ,A ₄), C ₃ =PAVG(A ₅ ,A ₆), C ₄ =PAVG(A ₇ ,A ₈), D ₁ =PAVG(C ₁ ,C ₂), D ₂ =PAVG(C ₃ ,C ₄), EB ₁=(A ₁ {circumflex over ( )}A ₉), EB ₂ =EB ₃ =EB ₄ =EB ₅ =EB ₆ =EB ₇ =EB ₈=0, EC ₁=(B ₁ {circumflex over ( )}A ₂), EC ₂=(A ₃ {circumflex over ( )}A ₄), EC ₃=(A ₅ {circumflex over ( )}A ₆), EC ₄=(A ₇ {circumflex over ( )}A ₈), ED ₁=(C ₁ {circumflex over ( )}C ₂), ED ₂=(C ₃ {circumflex over ( )}C ₄), E ₁ =EC ₁ & EB ₁ , E ₂ =E ₃ =E ₄=0, P ₁ =EC ₁ {circumflex over ( )}˜EB ₁ , P ₀ =EB ₁ , Q ₁ =˜EC ₂ , Q ₀=0, ER ₁ =P ₁ & Q ₁, R ₁ =˜EC ₃ , R ₀=0, S ₁ =˜EC ₄ , S ₀=0, ER ₂ =R ₁ & S₁, U ₂ =ED ₁ {circumflex over ( )}E ₁{circumflex over ( )}(P ₁ & Q ₁), U ₁ =P ₁ {circumflex over ( )}Q ₁ , U ₀ =P ₀, V ₂ =ED ₂{circumflex over ( )}(R ₁ & S ₁), V ₁ =R ₁ {circumflex over ( )}S ₁ , V ₀=0, E=(U ₂ & V ₂)|((U ₂ |V ₂) & U ₁ & V ₁), ET ₁=(ED ₁|(E ₁ {circumflex over ( )}ER ₁)) & (E ₁ |˜ER ₁), ET ₂=(ED ₂ & ˜ER ₂).   (90) The final solution is same as (78). We can simplify this solution as follows: U₁=EC₁ & EC₂, U₂=EC₃ & EC₄, U₃=ED₁ & ED₂, V ₁ =EC ₁ |EC ₂, V ₂ =EC ₃ |EC ₄, V ₃ =ED ₁ |ED ₂, V ₄ =V ₂ |EB ₁, W=(V ₁ & V ₂ & EB ₁)|(U ₁ & V ₄)|(U ₂ & (V ₁ |EB ₁)), F=V ₁ |V ₄, E=D₁{circumflex over ( )}D₂, G=U₁ & U₂ & EB₁, H=G & U₃ & E, R=PAVG(D ₁ ,D ₂)−(((E & (V ₃ |F))|(U ₃ & F)|(V ₃ & W)|G) & ONE)−(H & ONE).   (91)

The solution in (91) requires 46 instructions with a 53:46 computational advantage.

iii. Approximate SIMD Solution

We suggest 2 approximate solutions for this filter. For the first approximate solution, we assume the least significant bit of EC₁=EC₂=1, and EC₃=EC₄=0 to get the following: R=PAVG(D ₁ ,D ₂)−((D ₁ {circumflex over ( )}D ₂)|(ED ₁ & ED ₂)|((ED ₁ |ED ₂) & EB ₁)) & ONE.   (92) This solution requires 19 instructions, and produces a maximum error of ±1 for 9.38% of all possible values of A₁, . . . ,A₉ between [0,255]. The computational advantage is 53:19 (more than 3 times speedup).

The second approximate solution makes the assumption that the least significant bit of EC₁=1, and EC₃=0. We get the solution: W=(EC ₄ & EB ₁)|(EC ₂ & (EC ₄ |EB ₁)), R=PAVG(D ₁ ,D ₂)−((D ₁ ,D ₂)|(ED ₁ & ED ₂)|((ED ₁ |ED ₂) & W)) & ONE.   (93)

This solution requires 25 instructions, and produces a maximum error of ±1 for 6.25% of all possible values of A₁, . . . , A₉ between [0,255]. The computational advantage is 53:25 (more than 2 times speedup).

E. Type 4, Special Filter 4: R=(A₁+2A₂+3A₃+4A₄+3A₅+2A₆+A₇+8*ONE)>>4

This filter is also used for post-processing.

i. Conventional SIMD Solution

This filter can be implemented in SIMD architecture (assuming sufficient memory) by using the following steps:

-   -   1. (7 Instructions) A_(iL)=Unpack Low 4 Bytes of A_(i), for i         ε{1,2, . . . ,7},     -   2. (7 Instructions) A_(iH)=Unpack High 4 Bytes of A_(i), for i         ε{1,2, . . . ,7},     -   3. (13 Instructions) Add and Shift lower 4 words of A₁, . . .         ,A₅ to obtain lower 4 words of R_(L) as:         R _(L)=(A _(1L)+2A _(2L)+3A _(3L)+4A _(4L)+3A _(5L)+2A _(6L) +A         _(7L)+8*ONE₄)>>4,     -   4. (13 Instructions) Add and Shift higher 4 words of A₁, . . . ,         A₅ to obtain higher 4 words of R_(H) as:         R _(H)=(A _(1H)+2A _(2H)+3A _(3H)+4A _(4H)+3A _(5H)+2A _(6H) +A         _(7H)+8*ONE₄)>>4,     -   5. (1 Instruction) Pack R_(H) and R_(L) into final register R.         We require 41 instructions to compute this filter by         conventional SIMD methods.         ii. Efficient SIMD Solution

From (73), we get the: B ₁ =PAVG(A ₁ ,A ₇), B ₂ =A ₂ , B ₃ =A ₄ , B ₄ =A ₄ , B ₅ =A ₃ , B ₆ =A ₅ , B ₇ =A ₆ , B ₈ =PAVG(A ₃ ,A ₅), C ₁ =PAVG(B ₁ ,A ₂), C ₂ =A ₄ , C ₃ =PAVG(A ₃ ,A ₅), C ₄ =PAVG(A ₆ ,B ₈), D ₁ =PAVG(C ₁ ,A ₄), D ₂ =PAVG(C ₃ ,C ₄), EB ₁ =A ₁ {circumflex over ( )}A ₇ , EB ₂ =EB ₃ =EB ₄ =EB ₅ =EB ₆ =EB ₇=0. EB ₈ =A ₃ {circumflex over ( )}A ₅, EC ₁ =B ₁ {circumflex over ( )}A ₂ , EC ₂=0, EC ₃ =A ₃ {circumflex over ( )}A ₅ , EC ₄ =A ₆ {circumflex over ( )}B ₈, ED ₁ =C ₁ {circumflex over ( )}A ₄ , ED ₂ =C ₃ {circumflex over ( )}C ₄, E ₁ =EC ₁ & EB ₁ , E ₂ =E ₃=0, E ₄ =EC ₄ & EB ₈, P ₁ =EC ₁ {circumflex over ( )}˜EB ₁ , P ₀ =EB ₁ , Q ₁=1, Q ₀=0, ER ₁ =P ₁, R ₁ =˜EC ₃ , R ₀=0, S ₁ =EC ₄ {circumflex over ( )}˜EB ₈ , S ₀ =EB ₈ , ER ₂ =R ₁ & S ₁, U ₂ =ED ₁ {circumflex over ( )}E ₁ {circumflex over ( )}P ₁ , U ₁ =˜P ₁ , U ₀ =P ₀, V ₂ =ED ₂ {circumflex over ( )}E ₄{circumflex over ( )}(R ₁ & S ₁), V ₁ =R ₁ {circumflex over ( )}S ₁ , V ₀ =S ₀, E=(U ₂ & V ₂)|((U ₂ |V ₂) & U ₁ & V ₁)|((U ₂ |V ₂) & (U ₁ |V ₁) & U ₀ & V ₀), ET ₁=(ED|(E ₁ {circumflex over ( )}P ₁)) & (E ₁ |˜P ₁), ET ₂=(ED ₂|(E ₄{circumflex over ( )}ER₂)) & (E ₄ {circumflex over ( )}ER ₂).   (94) The final solution is same as (78). We can simplify this solution as follows: U ₁ =EC ₃ |EC ₄, U ₂ =EB ₁ |EB ₈, U ₃ =ED ₁ |ED ₂, U ₄ =EC ₁ |U ₁, U ₅ =U ₄ |U ₂, U ₆ =U ₅ |U ₃, U₇=EC₃ & EC₄, U ₈=(EC ₁ & U ₁)|U ₇, U ₉=(EC ₁ & U ₇)|(U ₈ & U ₂), R=PAVG(D ₁ ,D ₂)−(((D ₁ {circumflex over ( )}D ₂) & U ₆)|(ED ₁ & ED ₂ & U ₅)|(U ₃ & U ₉)) & ONE.   (95) The solution in (95) requires 36 instructions with a 41:36 computational advantage. iii. Approximate SIMD Solution

We suggest 2 approximate solutions for this filter. For the first approximate solution, we assume the least significant bit of EC₁=EC₃=1, and EC₄=EB₁=0 to get the following: R=PAVG(D ₁ ,D ₂)−((D ₁ {circumflex over ( )}D ₂)|(ED ₁ & ED ₂)|((ED ₁ |ED ₂) & EB ₈)) & ONE.   (96) This solution requires 19 instructions, and produces a maximum error of ±1 for 6.25% of all possible values of A₁, . . . ,A₇ between [0,255]. The computational advantage is 41:19 (more than 2 times speedup).

The second approximate solution makes the assumption that the least significant bit of EC₃=1, and EB₁=0. We get the solution: U ₉=(EC ₁ & EC ₄)|((EC ₁ |EC ₄) & EB ₈), R=PAVG(D ₁ ,D ₂)−((D ₁ {circumflex over ( )}D ₂)|(ED ₁ & ED ₂)|((ED ₁ |ED ₂) & U ₉)) & ONE.   (97) This solution requires 25 instructions, and produces a maximum error of ±1 for 3.13% of all possible values of A₁, . . . ,A₇ between [0,255]. The computational advantage is 41:25. F. Type 4, Summary of Results

Table VI below summarizes the instructions required to compute each filter (given sufficient memory) by the efficient and conventional SIMD methods. For the Efficient case, we give the instructions required for the exact and approximate solutions.

Summary of Results for Type 4 FIR Filters

TABLE VI Efficient Conventional Method Speedup Type 4 Filters Method Exact Approx. Exact Approx. (A₁ + A₂ + . . . + 67 N/A 16 N/A 4.2 A₁₆ + 8 * ONE) >> 4 (A₁ + 4A₂ + 6A₃ + 29 19  8 1.5 3.6 4A₄ + A₅ + 8 * ONE) >> 4 (A₁ + A₂ + 2A₅ + 2A₆ + 49 36 21 1.4 2.3 2A₇ + 2A₈ + 4A₉ + A₃ + A₄ + 8 * ONE) >> 4 (A₁ + 2A₂ + 2A₃ + 2A₄ + 53 46 19 1.2 2.8 2A₅ + 2A₆ + 2A₇ + 2A₈ + A₉ + 8 * ONE) >> 4 (A₁ + 2A₂ + 3A₃ + 4A₄ + 41 36 19 1.1 2.2 3A₅ + 2A₆ + A₇ + 8 * ONE) >> 4

The shaded areas show significant improvements in efficiency due to the analyses developed here.

Although the invention has been discussed with respect to specific embodiments thereof, these embodiments are merely illustrative, and not restrictive, of the invention. For example, although a two-operand SIMD instruction has been primarily discussed, techniques and features of the invention may be applicable to other applications where the number of operands, or arguments, of a SIMD instruction are not the same as the number of variables, or values, in a formula, computation or function to be implemented with the SIMD instruction (i.e, a “mismatched” instruction).

Although the invention has been described with respect to specific SIMD instructions to obtain an average of values, any other type of SIMD instruction or operation may benefit from the approach of the invention. Although specific operations such as addition, subtraction, bitwise AND, bitwise OR, bitwise logical right shift, bitwise logical left shift, bitwise exclusive OR, etc., are used in specific embodiments to achieve a result, other embodiments may use different operations, or combinations of operations, to achieve results. For example, an AND function can be realized by using an OR function and complementing, or inverting, the operands and result. Other such operational equivalents will be apparent.

Alternative methods of detecting when the sum of two packed values results in an odd number can be employed. Some processors may provide instructions that combine multiple operations into compound one or more instructions. Although specific reference has been made to a “SIMD” type of instruction, other types of parallel instructions may be within the scope of the invention. Although the SIMD instruction has been described as a single instruction, other embodiments may use SIMD instructions that occupy more than a single instruction's worth of clock cycles, instruction cycles, or the like.

There are various ways that the invention can be modified from specific embodiments described herein to achieve similar results. For example, adjustments to an approximate solution are performed as an intermediate step before computing the final result so that the approximate solution is no less than the actual solution. One modification can be to adjust the approximate solution so that it becomes no larger than the actual solution as an intermediate step. Such modifications will be apparent to one of skill in the art and are within the scope of the invention.

Any suitable programming language can be used to implement the routines of the present invention including C, C++, Java, assembly language, etc. Different programming techniques can be employed such as procedural or object oriented. The routines can execute on a single processing device or multiple processors. Although the steps, operations or computations may be presented in a specific order, this order may be changed in different embodiments. In some embodiments, multiple steps shown as sequential in this specification can be performed at the same time. The sequence of operations described herein can be interrupted, suspended, or otherwise controlled by another process, such as an operating system, kernel, etc. The routines can operate in an operating system environment or as stand-alone routines occupying all, or a substantial part, of the system processing.

Steps can be performed in hardware or software, as desired. Note that steps can be added to, taken from or modified from the steps presented in this specification without deviating from the scope of the invention. In general, the flowcharts are only used to indicate one possible sequence of basic operations to achieve a functional aspect of the present invention.

In the description herein, numerous specific details are provided, such as examples of components and/or methods, to provide a thorough understanding of embodiments of the present invention. One skilled in the relevant art will recognize, however, that an embodiment of the invention can be practiced without one or more of the specific details, or with other apparatus, systems, assemblies, methods, components, materials, parts, and/or the like. In other instances, well-known structures, materials, or operations are not specifically shown or described in detail to avoid obscuring aspects of embodiments of the present invention.

A “computer-readable medium” for purposes of embodiments of the present invention may be any medium that can contain, store, communicate, propagate, or transport the program for use by or in connection with the instruction execution system, apparatus, system or device. The computer readable medium can be, by way of example only but not by limitation, an electronic, magnetic, optical, electromagnetic, infrared, or semiconductor system, apparatus, system, device, propagation medium, or computer memory.

A “processor” includes any system, mechanism or component that processes data, signals or other information. A processor can include a system with a general-purpose central processing unit, multiple processing units, dedicated circuitry for achieving functionality, or other systems. Processing need not be limited to a geographic location, or have temporal limitations. For example, a processor can perform its functions in “real time,” “offline,” in a “batch mode,” etc. Portions of processing can be performed at different times and at different locations, by different (or the same) processing systems.

Reference throughout this specification to “one embodiment”, “an embodiment”, or “a specific embodiment” means that a particular feature, structure, or characteristic described in connection with the embodiment is included in at least one embodiment of the present invention and not necessarily in all embodiments. Thus, respective appearances of the phrases “in one embodiment”, “in an embodiment”, or “in a specific embodiment” in various places throughout this specification are not necessarily referring to the same embodiment. Furthermore, the particular features, structures, or characteristics of any specific embodiment of the present invention may be combined in any suitable manner with one or more other embodiments. It is to be understood that other variations and modifications of the embodiments of the present invention described and illustrated herein are possible in light of the teachings herein and are to be considered as part of the spirit and scope of the present invention.

Embodiments of the invention may be implemented by using a programmed general purpose digital computer, by using application specific integrated circuits, programmable logic devices, field programmable gate arrays, optical, chemical, biological, quantum or nanoengineered systems, components and mechanisms may be used. In general, the functions of the present invention can be achieved by any means as is known in the art. Distributed, or networked systems, components and circuits can be used. Communication, or transfer, of data may be wired, wireless, or by any other means.

It will also be appreciated that one or more of the elements depicted in the drawings/figures can also be implemented in a more separated or integrated manner, or even removed or rendered as inoperable in certain cases, as is useful in accordance with a particular application. It is also within the spirit and scope of the present invention to implement a program or code that can be stored in a machine-readable medium to permit a computer to perform any of the methods described above.

Additionally, any signal arrows in the drawings/Figures should be considered only as exemplary, and not limiting, unless otherwise specifically noted. Furthermore, the term “or” as used herein is generally intended to mean “and/or” unless otherwise indicated. Combinations of components or steps will also be considered as being noted, where terminology is foreseen as rendering the ability to separate or combine is unclear.

As used in the description herein and throughout the claims that follow, “a”, an and “the” includes plural references unless the context clearly dictates otherwise. Also, as used in the description herein and throughout the claims that follow, the meaning of “in” includes “in” and “on” unless the context clearly dictates otherwise.

The foregoing description of illustrated embodiments of the present invention, including what is described in the Abstract, is not intended to be exhaustive or to limit the invention to the precise forms disclosed herein. While specific embodiments of, and examples for, the invention are described herein for illustrative purposes only, various equivalent modifications are possible within the spirit and scope of the present invention, as those skilled in the relevant art will recognize and appreciate. As indicated, these modifications may be made to the present invention in light of the foregoing description of illustrated embodiments of the present invention and are to be included within the spirit and scope of the present invention.

Thus, while the present invention has been described herein with reference to particular embodiments thereof, a latitude of modification, various changes and substitutions are intended in the foregoing disclosures, and it will be appreciated that in some instances some features of embodiments of the invention will be employed without a corresponding use of other features without departing from the scope and spirit of the invention as set forth. Therefore, many modifications may be made to adapt a particular situation or material to the essential scope and spirit of the present invention. It is intended that the invention not be limited to the particular terms used in following claims and/or to the particular embodiment disclosed as the best mode contemplated for carrying out this invention, but that the invention will include any and all embodiments and equivalents falling within the scope of the appended claims. 

1. A method for obtaining an average of a plurality of values, wherein a first plurality of values is stored in a first packed structure, wherein a second plurality of values is stored in a second packed structure, the method comprising using an averaging operation on the values in the first and second packed structures to obtain a plurality of values in a packed average result, wherein a value in the packed average result equals a rounded-up average of a value in the first packed structure and a value in the second packed structure; determining whether the sum of the value in the first packed structure plus the value in the second packed structure is an odd number and, if so, performing the step of subtracting one from the value in the packed average result to obtain a packed adjusted result.
 2. The method of claim 1, wherein the step of using an averaging operation includes using a single-instruction multiple data operation.
 3. The method of claim 2, wherein the step of using a single-instruction multiple-data operation includes using a PAVG instruction.
 4. The method of claim 1, wherein the step of determining whether the sum of the value in the first packed structure plus the value in the second packed structure is an odd number comprises substeps of performing an exclusive-or operation on values in the first and second packed structures to obtain a packed exclusive-or result; masking all but the least significant bit (lsb) of values in the packed exclusive- or result to obtain a packed lsb result; and using the packed lsb result in the step of subtracting one from the value in the packed average result.
 5. The method of claim 1, wherein a structure includes a word of memory.
 6. The method of claim 1, wherein a structure includes a register.
 7. The method of claim 1, wherein the packed adjusted result is used in the derivation of a finite impulse response filter.
 8. The method of claim 1, wherein each structure comprises 8 values of 8 bits each.
 9. A method for adjusting the result of a PAVG instruction, wherein a first set, A, of packed values, a_(i), and a second set, B, of packed values, b_(i), are operated on by PAVG to obtain PAVG(A,B)=[(a_(i)+b_(i)+1)>>1, i=1, . . . ,8], the method comprising adjusting the result of the PAVG operation to obtain a packed value result, C, as C=PAVG(A, B)−(A{circumflex over ( )}B) & 0x01.
 10. A method for achieving an averaged result on packed binary values A₁,A₂, A₃,A₄, the method using a PAVG instruction that computes a rounded-up average on first and second sets of packed values to produce a resulting set of packed averages, wherein B₁=PAVG(A₁,A₂) and B₂=PAVG(A₃,A₄), the method comprising deriving a result, R, as $R = \left\{ \begin{matrix} {{{{{PAVG}\left( {B_{1},B_{2}} \right)} - \left( {{B_{1}}^{\hat{}}B_{2}} \right)}\&}\quad{ONE}} & {{{when}\quad E} = 0} \\ {{PAVG}\left( {B_{1},B_{2}} \right)} & {{{when}{\quad\quad}E} = 1} \end{matrix} \right.$ wherein ONE is a value with a one in the least significant bit position of one or more packed values and wherein E=1 when both (A₁+A₂+ONE) and (A₃+A₄+ONE) are odd integers.
 11. The method of claim 10, wherein EB₁=(A₁{circumflex over ( )}A₂) and EB₂=(A₃{circumflex over ( )}A₄), and wherein E=˜(A ₁ {circumflex over ( )}A ₂) & ˜(A ₃ {circumflex over ( )}A ₄) & ONE=˜(EB ₁ |EB ₂) & ONE.
 12. The method of claim 10, wherein the step of deriving includes deriving R as R=PAVG(B₁,B₂)−(B₁{circumflex over ( )}B₂) & ˜E & ONE.
 13. The method of claim 10, wherein the step of deriving includes deriving R as R=PAVG(B₁,B₂)−(B₁{circumflex over ( )}B₂) & ((A₁{circumflex over ( )}A₂)|(A₃{circumflex over ( )}A₄)) & ONE.
 14. A method for achieving an approximate averaged result on packed binary values A₁,A₂, A₃,A₄, for use in finite impulse response filter computations, the method using a PAVG instruction that computes a rounded-up average on first and second sets of packed values to produce a resulting set of packed averages, wherein B₁=PAVG(A₁,A₂) and B₂=PAVG(A₃,A₄), the method comprising deriving a result, R, as R=PAVG(B ₁ ,B ₂)−(B _(1{circumflex over ( )}B) ₂) & ONE. wherein ONE is a value with a one in the least significant bit position of one or more packed values.
 15. A method for achieving an averaged result on packed binary values for use in finite impulse response filter computations, the method using an instruction, PAVG, that computes a rounded-up average on first and second sets of packed values to produce a resulting set of packed averages, the method comprising detecting when the use of the PAVG instruction introduces a rounding-up increase in an averaged result; and decreasing the rounding-up increase to achieve a desired result.
 16. The method of claim 15, wherein the step of detecting further comprises detecting when one or more averaged results are odd.
 17. The method of claim 15, wherein an exact desired result is achieved.
 18. The method of claim 15, wherein an approximate desired result is achieved.
 19. The method of claim 18, further comprising assuming that a significant bit of at least one packed value averaged result of the PAVG instruction is a
 0. 20. The method of claim 18, further comprising assuming that a significant bit of at least one packed value averaged result of the PAVG instruction is a
 0. 21. A method for using a single-instruction multiple-data (SIMD) instruction to perform a function, wherein the SIMD instruction uses M arguments, wherein the function uses N variables, wherein M and N are not the same, the method comprising using the SIMD instruction on a plurality of packed values to obtain an inaccurate packed value result; and adjusting the inaccurate packed value result to obtain an adjusted packed value result.
 22. The method of claim 21, wherein the adjusted packed value result is an approximate result.
 23. The method of claim 22, further comprising correcting the adjusted packed value result to obtain a desired packed value result.
 24. The method of claim 21, wherein the SIMD instruction includes an averaging operation
 25. The method of claim 22, wherein the step of using the SIMD instruction includes using a PAVG instruction. 